我有一个测试场景,其中一个名为root的根证书颁发机构签署了一个由名为Intermediate的中间证书颁发机构创建的证书签名请求,而后者又签署了一个由主题Subject创建的证书签名请求。
我使用Tomcat作为我的web服务器,并将其配置为使用主题密钥存储(它包含根证书、中间证书、主题证书链和主题私钥),并启动它来侦听端口80 (HTTP)和443 (HTTPS)。
我在Firefox中安装了根证书(作为受信任的证书),并访问了我的域,这就是我得到的:
subject.usip.me uses an invalid security certificate.
The certificate is not trusted because no issuer chain was provided.
(Error code: sec_error_unknown_issuer)显然,Firefox无法验证chain的信任,或者类似的东西。现在,在详细介绍我的配置和步骤之前:我已经更改了Tomcat配置,以便它使用中间密钥存储,而不是使用主题密钥存储(中间密钥存储包含根证书、中间证书链和中间私钥)。使用这种配置,一切都可以正常工作。
我使用以下工具:
我使用下面的脚本创建了有问题的密钥存储区 (很长)。任何使用Java密钥工具的人都可以运行它(由于4096 RSA密钥大小,操作可能不会太快)。
脚本运行后,我可以验证我的主题密钥存储包含完整的信任链(据我所见):
c:\>keytool -list -keystore c:\subject.jks -storepass changeit -rfc它打印出下面(同样,相当长的)输出,粘贴在这里。对我来说,这似乎没什么问题(至少,经过几个小时的挣扎,我似乎看不出它有什么问题)。
我像这样通过Tomcat (跟着这个怎么--到)的server.xml设置了它(除了这个标签(默认情况下是注释删除)之外,我什么也不做)。
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="c:/subject.jks"
keystorePass="changeit"
keystoreType="jks"
keyAlias="subject"
keyPass="changeit" />(启动Tomcat之后,连接到它-当它使用Subject或Intermediate存储时-没有记录错误。)
在寻找解决方案时,我发现使用openssl可以验证我的服务,作为该工具的新手用户,我在域上运行了以下命令(使用Cygwin):
$ openssl s_client -connect subject.usip.me:443 -CAfile /cygdrive/c/root.pem -showcerts &> /cygdrive/c/openssl.log再一次,我在这里粘贴了冗长的输出。
它说,Verify return code: 24 (invalid CA certificate),这是奇怪的,因为它引用(如我所见)的根证书。现在,当我说我重新配置Tomcat以使用中间密钥存储时,我还运行了相同的命令,然后用Verify return code: 0 (ok)签出。所以我请客根证书是可以的。
我通过帖子和粘贴提到的域名和子域名都是在http://freedns.afraid.org/注册的免费域名,每个域名都指向我当前的地址(我想我应该提一下,也许这很重要)。
知道我做错什么了吗?
发布于 2012-08-19 21:33:59
好吧,我想通了。在生成对证书签名请求的答复时,我没有指定一些重要的X.509证书扩展。
文档。(搜索-ext.)
关键是要正确生成和签署中级证书。
keytool -gencert^
-alias root^
-ext BasicConstraints:critical=ca:true,pathlen:0^
-ext KeyUsage:critical=keyCertSign,cRLSign^
-infile intermediate.csr^
-keypass changeit^
-keystore root.jks^
-outfile intermediate.pem^
-rfc^
-sigalg sha512withrsa^
-storepass changeit^
-storetype jks^
-v和主题证书
keytool -gencert^
-alias intermediate^
-ext BasicConstraints:critical=ca:false^
-ext ExtendedkeyUsage:critical=serverAuth,clientAuth^
-ext KeyUsage:critical=digitalSignature,keyEncipherment^
-infile subject.csr^
-keypass changeit^
-keystore intermediate.jks^
-outfile subject.pem^
-rfc^
-sigalg sha512withrsa^
-storepass changeit^
-storetype jks^
-v当我有时间的时候,我会更新我的答案,并发布我的完整解决方案。
更新
我在GitHub上建立了一个小小的示例存储库,它包含了我为生成必要的密钥存储文件、证书等而编写的脚本。我用Bash重写了我的脚本,并在其中添加了许多配置参数。它可以在没有任何配置的情况下运行。在本例中,它将为root.lvh.me、intermediate.lvh.me和subject.lvh.me域(默认情况下)创建证书。将主题密钥存储与Tomcat一起使用,并将根证书安装到Firefox中,将产生一个经过验证的、安全的https://subject.lvh.me连接(在其他地方也没有,因此https://intermediate.lvh.me不会验证)。
https://stackoverflow.com/questions/12027707
复制相似问题