无法获得 go daddy ssl 证书以使用 spring boot
Posted
技术标签:
【中文标题】无法获得 go daddy ssl 证书以使用 spring boot【英文标题】:can't get go daddy ssl certificate to work with spring boot 【发布时间】:2019-05-15 02:01:21 【问题描述】:我有一个证书,其中包含在 go daddy 中生成的 CSR。
我尝试生成自己的 CSR 以获取我的域的证书。 我已按照他们的教程使用 CSR 生成商店:
keytool -genkey -alias codesigncert -keypass -keyalg RSA -keysize 2048 -dname "CN=displayname,O=companyname,C=US,ST=state,L=city" -keystore codesignstore -storepass
但是godaddy拒绝了生成的CSR,所以我使用了他们生成的那个。
之后我使用了 thomasvitale.com 上的教程中的这个命令:
keytool -import -alias <my alias> -file <downloadedcertificate file>.crt -keystore keystore.p12 -storepass password
生成的 .p12 密钥库无法启动,因为 spring 说:
DerInputStream.getLength(): lengthTag=109, too big.
阅读了很多内容,我发现这是生成密钥库的方式和某些东西的版本。因此,我不得不生成另一个密钥库。
为了生成当前有问题的密钥库,我尝试按照 medium.com 的说明进行操作:
用它来生成密钥库:
keytool -genkey -alias <alias> -keyalg RSA -keystore <keystore.jks> -keysize 2048
用它来生成 CSR:
keytool -certreq -alias <alias> -keystore <keystore.jks> -file <domain>.csr
发送 CSR 以生成 ssl 证书,使用 tomcat 选项下载它们。然后导入证书:
中级证书:keytool -import -trustcacerts -alias <alias> -file gd_bundle-g2-g1.crt -keystore <keystore.jks>
根证书:keytool -import -trustcacerts -alias <alias> -file e2e56xxxxf40c7.crt -keystore <keystore.jks>
然后我以这种方式创建了 pcks 密钥库:
keytool -importkeystore -srckeystore <keystore.jks> -destkeystore <keystore.p12> -srcstoretype JKS -deststoretype PKCS12 -deststorepass <password> -srcalias <src alias> -destalias <dest alias>
之后,我安装证书的 spring boot 配置是: 在对这个问题进行 cmets 之后,我改用 JKS 并删除了密码。
server:
port: 8443
ssl:
enabled: true
key-store-type: JKS
key-store: classpath:asgard_keystore.jks
key-store-password: generated
key-alias: asgard
将所有这些安装到 p12 后,服务器启动正常,但对服务器的任何请求都会产生:err_ssl_version_or_cipher_mismatch
或 SSL_ERROR_NO_CYPHER_OVERLAP
在wireshark 中捕捉到的只是说Alert 21 using TLS 1.2 Handshake Failure (40)。
我使用 undertow 作为服务器。我不记得我是否在 CSR 的姓名和姓氏字段中使用了域。
使用我得到的数字证书工具解码我的 CSR:
Common name
<my domain>
Organization
<my org>
Organizational unit
<my city>
City/locality
<my city>
State/province
<my estate>
Country
<my country>
Signature algorithm
SHA256
Key algorithm
RSA
Key size
2048
似乎我做的每一件事都和每一个教程一样,每次失败:(
根据对问题的评论,keytool -list 调用:
.jks 的 keytool -list:
Keystore type: jks
Keystore provider: SUN
Your keystore contains 3 entries
Alias name: asgard
Creation date: Dec 7, 2018
Entry type: trustedCertEntry
Owner: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Issuer: CN=Go Daddy Root Certificate Authority - G2, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Serial number: 7
Valid from: Tue May 03 07:00:00 UTC 2011 until: Sat May 03 07:00:00 UTC 2031
Certificate fingerprints:
MD5: 96<removed>:40
SHA1: 2<removed>B8
SHA256: 97:3A<removed>E9:76:FF:6A:62:0B:67:12:E3:38:32:04:1A:A6
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
< not relevant >
]
*******************************************
*******************************************
Alias name: intermediate
Creation date: Dec 14, 2018
Entry type: trustedCertEntry
Owner: CN=<removed>, OU=Domain Control Validated
Issuer: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Serial number: 5c<removed>
Valid from: Fri Dec 07 20:25:19 UTC 2018 until: Mon Dec 07 18:10:35 UTC 2020
Certificate fingerprints:
MD5: 31<removed>74:77
SHA1: 8D:<removed>:C0:F5:AE:0B
SHA256: 77:14:9<removed>8B:1D:67:46:1A:67:A2:72:2F:2F:9E:F2:16
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
< not relevant >
]
*******************************************
*******************************************
Alias name: server
Creation date: Dec 7, 2018
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=<removed>, OU=São Paulo, O=Ideas Farm, L=São Paulo, ST=SP, C=BR
Issuer: CN=a<removed>, OU=São Paulo, O=Ideas Farm, L=São Paulo, ST=SP, C=BR
< not relevant >
]
]
*******************************************
*******************************************
完整报告:pastebin report
我已经删除了我认为不相关的部分回复。我发现 pkcs (.p12) 文件报告为 jks 类型很奇怪。
另外,我从证书颁发机构收到的文件是:
5<removedhex>6b1b.crt
gd_bundle-g2-g1.crt
gdig2.crt.pem
gd_bundle 包含 3 个证书 -----BEGIN CERTIFICATE----- and -----END CERTIFICATE-----
3 次。其他两个只是一个。
【问题讨论】:
您可能创建了一个没有密钥的密钥库,尽管它可能取决于您使用的客户端,但您没有说。您已经压制了足够多的信息(并且格式错误更多)我无法猜测您实际上做了什么,但有一件事跳出来:您标识为“根证书”的文件名不是根,几乎可以肯定是服务器证书。如果这不是(唯一的)问题,请查看带有keytool -list
(可能还有-v
)的密钥库,以查看每个密钥库中的实际内容并与应有的内容进行比较。您使用的 Java 版本可能很重要,但您没有说出来。
我已经使用所有相关的 keystore -list 命令和更多观察结果编辑了我的问题。
Re p12 vs jks:在 Java 8 更新 60 及更高版本中,“JKS”密钥库提供程序实际上也可以读取 PKCS12;见the release notes。这是向 java 9 及更高版本的过渡步骤,默认情况下使用 PKCS12(而不是 JKS)。
【参考方案1】:
您已告诉 java 使用别名为 asgard
的证书。我可以在您的 .p12 转储中看到“asgard”实际上是一个 CA。看看楼主:
Alias name: asgard
Creation date: Dec 14, 2018
Entry type: trustedCertEntry
Owner: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Issuer: CN=Go Daddy Root Certificate Authority - G2, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
我猜你实际上是想告诉 spring 加载你的 .jks 文件并指定一个别名 codesigncert
。
此外,请删除您的 ciphers
和 enabled-protocols
属性,除非您有充分的理由覆盖 spring 设置为默认值的内容。 Spring 通过最新的安全公告使其默认值保持最新。
最后,更改您的密钥库密码,因为现在整个互联网都知道它是什么了 :)
【讨论】:
我会尝试所有这些。 keystore pw 只是一个测试,我们实际上使用 vault 来存储敏感数据。 :) 所以,为了清楚起见,我必须直接使用 jks 而不是 pkcs (p12) 文件? Spring 支持 PKCS12 和 JKS 格式。您应该添加“codesigncert”作为您的“PrivateKeyEntry”并配置 Spring 以使用它。您应该将您的颁发者 CA 和任何中间体作为“trustedCertEntry”条目导入,以便到达您的 SSL 调用将能够验证颁发者链到根。 如何将这些导入 jks? 我同意asgard
是错误的,但我在发布的转储中没有看到任何codesigncert
。 @Lucas:名为server
的条目是您列表中唯一的私钥条目,从时间上看确实是您的实际私钥,但您的虚拟/自签名证书将导致Chrome 中的 cert_authority_invalid (其他有所不同)。您需要将 CA 颁发的服务器证书(应为 (hex).crt)导入别名 server
(在使用的密钥库中)。 (正如 Andy 所说,您还应该在密钥库中拥有中间证书,尽管名称具有误导性。)
将 Spring server.ssl.trust-store.*
属性设置为密钥库的等效值。使用-Djavax.net.debug=all
运行您的Java 服务器。会很吵。首先观察转储您的信任库的日志输出。您希望它显示您的信任库,而不是默认的 JDK 之一(包含数十个 Internet CA 的那个)。然后在您的客户端连接时立即查看输出。您将看到握手的进度以及放弃的位置。【参考方案2】:
我已经解决了这个问题。
在对每个证书进行了很多处理之后,我发现 GoDaddy 发出了证书响应和 2 个相等的中间证书。两者都在下载包中,里面没有根证书。
发生的事情是我有一个自签名的虚拟密钥,如 cmets 中所述,我不知道我必须使用与我的私钥相同的别名导入服务器证书(证书响应)。我正在使用另一个别名导入,认为它是别的东西。我的私钥将保持自签名且未经验证。
我遇到的关于密码的错误是因为我告诉 spring 使用不是私钥的证书。那些不支持解码握手。
我遇到的另一个问题是,godaddy 没有在您下载的捆绑包中提供根证书。我试图添加两个中间体,而根在他们拥有的存储库中可用。下载并导入正确的根证书后,我可以将私钥验证证书导入到与我的虚拟密钥相同的别名。
因此,解决方案只是从用于创建 CSR 的 JKS 密钥库(仅包含我生成的私钥的密钥库)开始。然后添加根证书和中间证书,最后添加服务器证书(具有十六进制名称的证书),别名与私钥相同。
【讨论】:
我可以知道您的 Spring Boot 应用程序托管在哪里吗?我目前在通过 IP 地址访问的 Azure 云中托管我的 Spring Boot 应用程序。我了解到,如果通过 IP 地址访问应用程序,则无法保护应用程序。 托管在数字海洋上。 谢谢。就我而言,我将它作为 jar 可执行文件在 azure 的 linux vm 中运行。我正在通过其 ip 地址访问那些 spring boot api 端点。那么,你知道SSL证书中的域名应该是什么吗? 我认为主机/机器对 spring 加载其证书链的方式没有影响。唯一会改变它的是如果您使用不同的服务器来运行 java。我穿着弹簧靴跑步。我相信 undertow、jboss、glassfish 和你的软件都可以运行相同的和 tomcat,因为战争可能会以另一种方式加载证书。嵌入式 tomcat 的行为可能与 jboss 完全一样。以上是关于无法获得 go daddy ssl 证书以使用 spring boot的主要内容,如果未能解决你的问题,请参考以下文章
我需要将 .CER 转换为 .CRT 以获得 Apache SSL 证书吗?如果是这样,怎么做?