Java 在Dropwizard中设置SSL

Java 在Dropwizard中设置SSL,java,ssl,https,keystore,dropwizard,Java,Ssl,Https,Keystore,Dropwizard,我正在尝试在服务器中设置SSL。我从GoDaddy获得了SSL,并从他们那里收到了两个文件,即: gd_束-g2-g1.crt b78********.crt(基本上是一个名为随机字符串的文件) 我在密钥库中添加了别名为root的gd_bundle-g2-g1.crt证书,并添加了另一个别名为域别名的证书 我的.yml配置文件如下所示:(我刚刚粘贴了.yml文件的相关部分) 问题是,每当我尝试启动服务器时,都会收到以下错误: java.lang.IllegalStateException: Un


我正在尝试在服务器中设置SSL。我从GoDaddy获得了SSL,并从他们那里收到了两个文件,即:

  • gd_束-g2-g1.crt
  • b78********.crt(基本上是一个名为随机字符串的文件)
  • 我在密钥库中添加了别名为root的gd_bundle-g2-g1.crt证书,并添加了另一个别名为域别名的证书

    我的.yml配置文件如下所示:(我刚刚粘贴了.yml文件的相关部分)

    问题是,每当我尝试启动服务器时,都会收到以下错误:

    java.lang.IllegalStateException: Unable to retrieve certificate chain
    
    当我在上面的.yml中将validateCerts设置为false时,由于明显的原因,此错误会消失,但当我尝试访问URL时,我得到:
    我似乎陷入了困境。我的服务器可以完美地使用http,但https无法正常工作!:( 考虑到我的最终目标是让https正常工作,以及我当前的场景,我有以下问题:

  • 我是否错误地处理了证书文件
  • 我的.yml文件中是否缺少需要添加的内容,或者是否存在错误
  • 或者这是我在这张照片上遗漏的东西

  • 感谢您的帮助。

    问题终于解决了!下面是我如何让它工作的(希望这能帮助那些很难了解如何使用Dropwizard使SSL工作的人)

  • 首先,我必须连接
    b78*********.crt
    gd_bundle-g2-g1.crt
    (确保
    b78*********.crt
    的内容在另一个文件之前)。从现在开始,让我们将该文件称为all_combined.crt
  • 然后我必须运行这个命令来生成一个.p12文件:
  • C:\xampp\apache\bin>openssl.exe pkcs12-export-in all_combined.crt -inkey myKey.key-out keystore.p12-CAfile temp.crt

    myKey.key是您在生成CSR时必须创建的文件,以便从授权机构请求SSL

  • 然后我必须运行此命令,将上面的generate.p12包含到我的密钥库中:
  • C:\Program Files\Java\jdk1.8.0\U 65\bin\keystore>。\keytool.exe-importkeystore-srckeystore-keystore-keystore.p12-destkeystore-myKeyStore.jks-srcstoretypkcs12-deststoretype jks

    这就是密钥库中所需的全部内容

  • 最后,我对.yml文件做了一点小小的更改:
  • 请注意,我已将validateCerts和validatePeers设置为false。 然后我重新启动了Dropwizard服务器,一切正常,服务器正在侦听并响应端口8443!:-)


    PS:我不能100%确定每一步做什么,或者是否每一步都是必需的。但是经过一个小时又一个小时的搜索,我终于找到了一些工作,我一定会在以后有时间的时候读到这方面的细节。在那之前,我希望这能帮那些被困在上面的人解除障碍。

    对于其他即将到来的人,我用另一种方式在Dropwizard/Linux中解决了这个问题

    首先生成密钥:

     keytool -genkey -alias <aliasname> -keyalg RSA -keystore keystore.jks -keysize 2048
    
    keytool-genkey-alias-keyalg RSA-keystore keystore.jks-keysize 2048
    
    然后生成您的CSR:

     keytool -certreq -alias <aliasname> -file csr.txt -keystore keystore.jks
    
    keytool-certreq-alias-file csr.txt-keystore keystore.jks
    
    打开csr.txt并复制所有内容。转到GoDaddy粘贴它并下载这两个.crt文件

    然后连接b78*********.crt和gd_bundle-g2-g1.crt的内容(确保b78*********.crt的内容在另一个文件之前)。从现在起,让我们将该文件称为all_combined.crt

    最后,将您的信任证书与.jks结合使用:

    keytool -import -trustcacerts -keystore keystore.jks -storepass <keystorepassword> -alias <aliasname> -file all_combined.crt
    
    keytool-import-trustcacerts-keystore keystore.jks-storepass-alias-file all_combined.crt
    
    然后在.yml文件中,让以下内容:

      applicationConnectors:
    - type: http
      port: 8080
    - type: https
      port: 8443
      keyStorePath: keystore.jks
      keyStorePassword: <keystorepassword>
      keyStoreType: JKS
      supportedProtocols: [TLSv1, TLSv1.1, TLSv1.2]
    
    应用程序连接器:
    -类型:http
    端口:8080
    -类型:https
    港口:8443
    keyStorePath:keystore.jks
    密钥密码:
    keyStoreType:JKS
    支持的协议:[TLSv1、TLSv1.1、TLSv1.2]
    

    就是这样,玩得开心

    我以前在捆绑证书方面遇到过问题。如果你打开它,它应该有两个证书。尝试导入每一个individually@Austin:捆绑包中有3个条目。我按照上面所说的做了,现在它说:java.lang.Exception:在密钥库中找不到证书。我使用命令:keytool-list-keystore myKeyStore.jks查找了我的密钥库,它向我显示了4个条目(3个来自bundle,1个单独存在)您是否也导入了
    b78********.crt
    ?@Austin是的,我导入了。难道我不应该这样做吗?那应该是有效的:/你如何生成你的密钥?在第二个命令中,我得到一个错误:无法加载私钥当您执行validateCerts时,此配置是否有效?true?您提到的csr.txt文件是什么?@zafrani当您执行此命令时生成:keytool-certreq-alias-file csr.txt-keystore keystore.jk如果您在尝试合并信任时收到任何类型的错误certs,请运行这个命令keytool-exportcert-alias-keystore keystore.jks-keyalg RSA-file all_combined.crt为什么我需要文件all_combined.crt在docker yml文件中时我只写keystore.jks文件?因为你需要将手动合并的all_combined.crt导入linux。
    keytool -import -trustcacerts -keystore keystore.jks -storepass <keystorepassword> -alias <aliasname> -file all_combined.crt
    
      applicationConnectors:
    - type: http
      port: 8080
    - type: https
      port: 8443
      keyStorePath: keystore.jks
      keyStorePassword: <keystorepassword>
      keyStoreType: JKS
      supportedProtocols: [TLSv1, TLSv1.1, TLSv1.2]