【问题标题】:Setting up SSL in Dropwizard在 Dropwizard 中设置 SSL
【发布时间】:2016-05-02 08:43:06
【问题描述】:


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

  1. gd_bundle-g2-g1.crt
  2. b78*********.crt(基本上是一个像随机字符串一样命名的文件)

我已在我的密钥库中添加了具有别名 rootgd_bundle-g2-g1.crt 证书,并已使用我的域别名添加了另一个证书。

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

server:
  applicationConnectors:
  - type: http
    port: 8080
  - type: https
    port: 8443
    keyStorePath: keystore/myKeyStore.jks
    keyStorePassword: "myPassword"
    validateCerts: true

  adminConnectors:
  - type: http
    port: 8081

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

java.lang.IllegalStateException: Unable to retrieve certificate chain

当我在上面的 .yml 中将 validateCerts 设置为 false 时,出于显而易见的原因,此错误消失了,但是当我尝试访问 URL 时,我得到: Connection closed error when trying to access the URL
我似乎陷入了非常糟糕的境地。我的服务器与 http 完美配合,但 https 无法正常工作! :( 鉴于我使 https 工作的最终目标和我目前的情况,我有以下问题:

  1. 我是否错误地处理了证书文件?
  2. 我的 .yml 文件中是否缺少需要添加的内容,或者那里有什么问题?
  3. 还是我在这张照片中完全遗漏了什么?

感谢您的帮助。

【问题讨论】:

  • 我过去曾遇到过捆绑证书的问题。如果你打开它,它应该有两个证书。尝试单独导入每个
  • @Austin:捆绑包中有 3 个条目。我按照你上面说的做了,现在它说:java.lang.Exception:在密钥库中找不到证书。我使用以下命令查找了我的密钥库:keytool -list -keystore myKeyStore.jks,它向我显示了 4 个条目(3 个来自 bundle,1 个单独存在)
  • 你是否也导入了b78*********.crt
  • @Austin 是的,我做到了。我不应该这样做吗?
  • 这应该有效:/

标签: java ssl https keystore dropwizard


【解决方案1】:

问题终于解决了!这是我如何让它工作的(希望这可以帮助那些难以弄清楚如何使 SSL 与 Dropwizard 一起工作的人)

  1. 首先我必须连接b78*********.crtgd_bundle-g2-g1.crt 的内容(确保b78*********.crt 的内容在另一个文件之前)。从现在开始,我们将该文件称为 all_combined.crt。
  2. 然后我必须运行这个命令来生成一个 .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 时必须创建的文件。

  1. 然后我必须运行此命令以将上述生成 .p12 包含到我的密钥库中:

C:\Program Files\Java\jdk1.8.0_65\bin\keystore>..\keytool.exe -importkeystore -srckeystore keystore.p12 -destkeystore myKeyStore.jks -srcstoretype pkcs12 -deststoretype jks

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

  1. 最后我对 .yml 文件做了一点改动:
server:
  applicationConnectors:
  - type: http
    port: 8080
  - type: https
    port: 8443
    keyStorePath: ./keystore/myKeyStore.jks
    keyStorePassword: "myPassword"
    validateCerts: false
    validatePeers: false

请注意,我已将 validateCerts 和 validatePeers 设置为 false。 然后我重新启动了我的 Dropwizard 服务器,一切都开始按预期工作,我的服务器正在监听并响应端口 8443! :-)

PS:我不能 100% 确定每个步骤的作用或是否需要每个步骤。但是经过数小时的搜索后,我终于找到了一些工作,并且当我有时间时肯定会阅读有关此内容的详细信息。在那之前,希望这可以解除卡在上面的人。

【讨论】:

  • 如何生成密钥?在第二个命令中,我收到错误:无法加载私钥
  • 执行 validateCerts: true 时,此配置是否有效?
【解决方案2】:

对于其他人,我以另一种方式在 Dropwizard/Linux 中解决了这个问题。

首先生成您的密钥:

 keytool -genkey -alias <aliasname> -keyalg RSA -keystore keystore.jks -keysize 2048

然后生成您的 CSR:

 keytool -certreq -alias <aliasname> -file csr.txt -keystore keystore.jks

打开您的 csr.txt 并复制所有内容。去 GoDaddy 粘贴它,然后将这两个 .crt 文件作为 Others 下载。

然后将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

然后在你的 .yml 文件上让这个:

  applicationConnectors:
- type: http
  port: 8080
- type: https
  port: 8443
  keyStorePath: keystore.jks
  keyStorePassword: <keystorepassword>
  keyStoreType: JKS
  supportedProtocols: [TLSv1, TLSv1.1, TLSv1.2]

就是这样,玩得开心!

【讨论】:

  • 你提到的csr.txt文件是什么?
  • @zafrani 您在执行此操作时生成:keytool -certreq -alias -file csr.txt -keystore keystore.jks
  • 如果您在尝试合并信任证书时收到任何类型的错误,请运行此命令 keytool -exportcert -alias -keystore keystore.jks -keyalg RSA -file all_combined.crt跨度>
  • 在 docker yml 文件中我只写 keystore.jks 文件时,为什么需要文件 all_combined.crt?
  • 因为你需要将你手动合并的all_combined.crt导入到你的linux中。
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2019-09-23
相关资源
最近更新 更多