首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Tomcat中间证书`sec_error_unknown_issuer‘

Tomcat中间证书`sec_error_unknown_issuer‘
EN

Stack Overflow用户
提问于 2012-08-19 15:34:24
回答 1查看 2.4K关注 0票数 0

我有一个测试场景,其中一个名为root的根证书颁发机构签署了一个由名为Intermediate的中间证书颁发机构创建的证书签名请求,而后者又签署了一个由主题Subject创建的证书签名请求。

我使用Tomcat作为我的web服务器,并将其配置为使用主题密钥存储(它包含根证书、中间证书、主题证书链和主题私钥),并启动它来侦听端口80 (HTTP)和443 (HTTPS)。

我在Firefox中安装了根证书(作为受信任的证书),并访问了我的域,这就是我得到的:

代码语言:javascript
复制
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: 1.7.0_05
  • Tomcat: 7.0.29
  • Firefox: 14.0.1

我使用下面的脚本创建了有问题的密钥存储区 (很长)。任何使用Java密钥工具的人都可以运行它(由于4096 RSA密钥大小,操作可能不会太快)。

脚本运行后,我可以验证我的主题密钥存储包含完整的信任链(据我所见):

代码语言:javascript
复制
c:\>keytool -list -keystore c:\subject.jks -storepass changeit -rfc

它打印出下面(同样,相当长的)输出,粘贴在这里。对我来说,这似乎没什么问题(至少,经过几个小时的挣扎,我似乎看不出它有什么问题)。

我像这样通过Tomcat (跟着这个怎么--到)的server.xml设置了它(除了这个标签(默认情况下是注释删除)之外,我什么也不做)。

代码语言:javascript
复制
<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):

代码语言:javascript
复制
$ 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/注册的免费域名,每个域名都指向我当前的地址(我想我应该提一下,也许这很重要)。

知道我做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-19 21:33:59

好吧,我想通了。在生成对证书签名请求的答复时,我没有指定一些重要的X.509证书扩展。

文档。(搜索-ext.)

关键是要正确生成和签署中级证书。

代码语言:javascript
复制
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

和主题证书

代码语言:javascript
复制
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不会验证)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12027707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档