2017-10-02 5 views
0

J'essaie de me connecter à un hôte spécifique avec le support TLS. J'ai une clé privée valide - "my.key", mon certificat - "my.crt", et aussi le certificat rootCA "root_ca.crt". Je connais déjà l'hôte demandé en utilisant OpenSsl. Vertx peut utiliser des différentes variantes comment faire:Impossible de se connecter à l'hôte par TLS avec Vert.x

  • Par JksOptions() et java fichier keystore ".jks"
  • Par PfxOptions() et le fichier ".pfx" (en format PKCS12)
  • par PemKeyCertOptions() et deux fichiers ("key.pem" et "cert.pem")

Mais quand je fais comme ceci:

NetClient client = vertx.createNetClient(
       (NetClientOptions) new NetClientOptions() 
         .setLogActivity(true) 
         .setSsl(true) 
         .setOpenSslEngineOptions(new OpenSSLEngineOptions()) 
         .addEnabledSecureTransportProtocol("TLSv1.2") 
         .setJksOptions(
           new JksOptions() 
             .setPath("/path/to/my.jks") 
             .setPassword("password") 
         ) 
     ); 
client.connect(some_port, "some_host", ar -> { 
      if (ar.succeeded()) { 
       LOG.debug("Connection succeeded!!!!"); 
      } else { 
       LOG.debug("Connection failed!!!! :: {} :: {}", ar.cause(), ar.cause().getMessage()); 
      } 
     }); 

build est succ ess, mais quand je cours ce code j'ai l'exception:

INFO: Succeeded in deploying verticle 
[vert.x-eventloop-thread-0] DEBUG io.netty.handler.ssl.ReferenceCountedOpenSslContext - verification of certificate failed 
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:397) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:281) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:136) 
    at io.netty.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback.verify(ReferenceCountedOpenSslClientContext.java:223) 
    at io.netty.handler.ssl.ReferenceCountedOpenSslContext$AbstractCertificateVerifier.verify(ReferenceCountedOpenSslContext.java:606) 
    at org.apache.tomcat.jni.SSL.readFromSSL(Native Method) 
    at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.readPlaintextData(ReferenceCountedOpenSslEngine.java:470) 
    at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:927) 
    at io.netty.handler.ssl.ReferenceCountedOpenSslEngine.unwrap(ReferenceCountedOpenSslEngine.java:1033) 
    at io.netty.handler.ssl.SslHandler$SslEngineType$1.unwrap(SslHandler.java:200) 
    at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1117) 
    at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1039) 
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:411) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:341) 
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:363) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:349) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:642) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:565) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:479) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:441) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:392) 
    ... 30 more 

Peut-être que je fais quelque chose de mal lors de la création du keystore? Pour le créer j'utilise ce tutoriel - https://support.adeptia.com/hc/en-us/articles/207878953-How-to-create-a-KeyStore-with-certificate-chain

S'il vous plaît aidez-moi à comprendre comment puis-je obtenir keystore correct de se connecter avec mon hôte par TLS?

Répondre

0

je trouve un moyen de créer correctement java keystore au format PKCS12 par cette commande:

openssl pkcs12 -inkey my.key -in my.crt -export -out domain.pfx 

puis mettre généré fichier « domain.pfx » dans PfxOptions et fichier « root_ca.crt » mis en PemTrustOptions comme ce:

return new NetClientOptions() 
      .setSsl(true) 
      .addEnabledSecureTransportProtocol("TLSv1.2") 
      .setPfxKeyCertOptions(
        new PfxOptions() 
          .setPath(pathToKeystoreFile) 
          .setPassword(keystorePassword) 
      ) 
      .setPemTrustOptions(
        new PemTrustOptions() 
          .addCertPath(rootCACertificate) 
      ); 

PS keystorePassword que vous avez entré lors de la création d'un certificat.