无法获得 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 &lt;alias&gt; -file gd_bundle-g2-g1.crt -keystore &lt;keystore.jks&gt;

根证书:keytool -import -trustcacerts -alias &lt;alias&gt; -file e2e56xxxxf40c7.crt -keystore &lt;keystore.jks&gt;

然后我以这种方式创建了 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_mismatchSSL_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

此外,请删除您的 ciphersenabled-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的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Let's Encrypt永久免费SSL证书

如何使用Let's Encrypt证书加密

Let's Encrypt ssl证书怎么下载?

我需要将 .CER 转换为 .CRT 以获得 Apache SSL 证书吗?如果是这样,怎么做?

无法删除自签名证书以在 Virtualmin 上使用我自己的证书

Let's Encrypt+Apache+Tomcat实现免费HTTPS