Skip to main content
 首页 » 编程设计

openssl之链式客户端证书

2024年10月25日8虾米姐

我想使用 SSL 客户端证书来验证连接到 tomcat6/7 的用户。我已经正确配置了 tomcat,并且我使用我提供给 tomcat 的信任库中的证书签名的证书正在从 IE 和 Firefox 成功进行身份验证。

我还想链接客户端证书,因为我想让客户能够管理自己的用户。我可以通过向客户颁发一个迭代管理 CA 证书来实现这一点,他们将使用该证书来签署其他用户证书。我需要用户的浏览器发送用户证书,与管理 CA(由我的根证书签名)链接以进行身份​​验证。

我正在使用 openssl,并且我已经创建了一个根 CA 和一个中间 CA,并且我已经使用中间 CA 来签署叶证书。我已将所有三个证书都转换为 pkcs12 和 pem,并使用 keytool 将根证书导入到 tomcat 的信任库中。 openssl –verify 将根据中间证书验证叶 pkcs12(并根据根证书进行中间验证)。但是我无法获得叶证书 (pkcs12) 来验证根证书 (pkcs12)。我也无法让 IE 或 Firefox 使用叶证书进行身份验证。 IE 会提示我输入证书,但是验证失败(在 tomcat 的日志中没有提到连接或失败)。 Firefox 不提示输入叶子证书;它只是无法进行身份验证。

以下是我尝试使用 openssl 验证叶与根的方法:

openssl verify -CAfile ..\root\Root.pem Leaf.pem 

以下是我用来生成三个证书的脚本:
根.bat:
set name=Root 
set keyPassword=dummypassword 
set trustPassword=dummypassword 
openssl genrsa -des3 -passout pass:%keyPassword% -out %name%.key 4096 
openssl req -new -key %name%.key -passin pass:%keyPassword% -out %name%.csr -subj "/C=US/ST=Chaos/L=TimeNSpace/O=None/CN=%name%" 
openssl x509 -req -days 3650 -in %name%.csr -signkey %name%.key -passin pass:%keyPassword% -extfile GenerateCertificate.cfg -extensions v3_ca -out %name%.crt 
openssl pkcs12 -export -in %name%.crt -inkey %name%.key -passin pass:%keyPassword% -passout pass:%keyPassword% -out %name%.pkcs12 
keytool -noprompt -import -file %name%.crt -alias %name% -keystore %name%.truststore -deststorepass %trustPassword% 
keytool -list -v -keystore %name%.truststore -storepass %trustPassword% > %name%.truststore.dump.txt 
keytool -exportcert -alias %name% -keystore %name%.truststore -storetype jks -storepass %trustPassword% -rfc -file %name%.truststore.pem 
openssl pkcs12 -in %name%.pkcs12     -out %name%.pem     -nodes -passin pass:%keyPassword% 

中间.bat:
set name=Intermediate 
set password=dummypassword 
set caDir=../root 
set caName=Root 
set caPassword=dummypassword 
openssl genrsa -des3 -passout pass:%password% -out %name%.key 2048 
openssl req -new -key %name%.key -passin pass:%password% -out %name%.csr -subj "/C=US/ST=Chaos/L=TimeNSpace/O=None/CN=%name%" 
openssl x509 -req -days 3650 -in %name%.csr -CA %caDir%/%caName%.crt -CAkey %caDir%/%caName%.key -passin pass:%caPassword% -set_serial 1 -extfile GenerateCertificate.cfg -extensions v3_ca -out %name%.crt 
openssl pkcs12 -export -in %name%.crt -inkey %name%.key -passin pass:%password% -passout pass:%password% -chain -CAfile %caDir%/%caName%.crt -out %name%.pkcs12 
openssl pkcs12 -in %name%.pkcs12     -out %name%.pem     -nodes -passin pass:%password% 

叶.bat:
set name=Leaf 
set password=dummypassword 
set caDir=../intermediate 
set caName=Intermediate 
set caPassword=dummypassword 
openssl genrsa -des3 -passout pass:%password% -out %name%.key 2048 
openssl req -new -key %name%.key -passin pass:%password% -out %name%.csr -subj "/C=US/ST=Chaos/L=TimeNSpace/O=None/CN=%name%" 
openssl x509 -req -days 3650 -in %name%.csr -CA %caDir%/%caName%.crt -CAkey %caDir%/%caName%.key -passin pass:%caPassword% -set_serial 1 -out %name%.crt 
openssl pkcs12 -export -in %name%.crt -inkey %name%.key -passin pass:%password% -passout pass:%password% -chain -CAfile %caDir%/%caName%.pem -out %name%.pkcs12 
openssl pkcs12 -in %name%.pkcs12     -out %name%.pem     -nodes -passin pass:%password% 

生成证书.cfg:
[ v3_ca ] 
subjectKeyIdentifier=hash 
authorityKeyIdentifier=keyid:always,issuer 
basicConstraints = CA:true,pathlen:3 

请您参考如下方法:

问题是根证书和中间证书不是作为 CA 证书创建的。

要将它们创建为 CA 证书,我添加了

-extfile GenerateCertificate.cfg -extensions v3_ca 

到他们的创建脚本,并将 GenerateCertificate.cfg 文件添加到我的工作目录(其中包含证书创建批处理文件)。

我已经编辑了我的原始帖子以反射(reflect)这些变化。