gpt4 book ai didi

java - 需要为SSL配置Tomcat 7

转载 作者:太空宇宙 更新时间:2023-11-03 14:34:49 24 4
gpt4 key购买 nike

我正在努力为Tomcat配置SSL,非常感谢您的帮助。出于我的目的,我需要创建一个根证书和一个由根证书签名的服务器证书。

为了帮助我理解,我将其分为两个步骤:使用openssl创建证书,以及将证书导入Tomcat的密钥库。这是我使用openssl和keystore命令的步骤序列。

-- Create certficates --
1. Create CA key in private directory:
openssl genrsa -out CA.key 4096
2. Create CA PEM request using CN <Root Name> and CA key:
openssl req -key ../private/CA.key -new -out CA.req
3. Create CA PEM using Create CA PEM request:
openssl x509 -req -days 365 -in CA.req -signkey ../private/CA.key -sha256 -out CA.pem
4. Create server key (encrypted with password):
openssl genrsa -des3 -out server.key 4096
5. Create server PEM request using CN <FQDN of Server>:
openssl req -new -key server.key -out server.req
6. Create server PEM using Create server PEM request:
openssl x509 -req -days 3650 -in server.req -signkey ../private/CA.key -out server.pem
7. Export CA certificate as PKCS12 file (possibly not necessary):
openssl pkcs12 -export -inkey ../private/CA.key -in CA.pem -out CA.p12
8. Export server certificate as PKCS12 file:
openssl pkcs12 -export -inkey ../private/CA.key -in server.pem -out server.p12

-- Install certificates --
9. Add CA PEM to server keystore:
keytool -import -trustcacerts -alias root -file CA.pem -keystore keystore.jks
10. Add server PKCS12 to client keystore:
keytool -import -alias server -file server.p12 -keystore KeyStore.jks


在最后一个命令中,我得到以下错误消息:

keytool error: java.lang.Exception: Input not an X.509 certificate


我不完全了解PEM和PKCS12格式之间的关系,为什么我需要导入PEM格式的根证书和PKCS12格式的服务器证书-也许这就是我要出问题的地方?

谢谢你的帮助。

最佳答案

通常是HAProxy SSL termination + client certificate validation + curl / java client

首先,您的#6是错误的;您不会创建由CA签名的服务器证书,而是创建具有服务器名称和CA密钥的自签名证书。这就是为什么#8需要将“服务器”证书与CA密钥配对的原因,这通常是没有意义的。在#6中使用-CA-CAkey代替,并更改8以使用服务器密钥和服务器证书,最好还使用-CA将CA证书(仅)用作CA证书-即:

 openssl pkcs12 -export -in server.pem -inkey server.key -CA CA.pem -out server.p12


其次,正如我现在更新的重复说明中所述,您可能根本不需要转换为JKS。 Java通常可以处理PKCS12。但是,如果这样做,则需要使用此处所示的 -importkeystore,这是一个单独且不同的操作,而不是 -import[cert]

最后,您的部分困惑可能是由于滥用“ PEM”引起的。 PEM并不是一件简单的事情。它是一种可用于多种用途的格式,由一个包含5个连字符的BEGIN行,一个BEGIN单词,一个或几个标识数据类型的单词以及另外5个连字符组成;然后是一个可选的(相当少见的)RFC822样式的标头;然后一行或多行base64编码BEGIN行指定的任何数据;然后用END代替BEGIN。

PEM可以用于证书(多种格式),密钥(多种格式),CSR,CRL,OCSP请求和响应,多种格式的消息以及其他内容。您更名为“ .pem”的文件更准确地说是PEM格式的证书。您使用的“ .key”和“ .req”文件也是PEM格式,但不是证书,而是密钥和证书请求(CSR)。证书文件(采用PEM或任何其他格式)与PKCS12文件之间的主要区别(赦免)是PKCS12通常既包含私钥又包含证书,或者(通常)包含多个证书的“链”。 (尽管Java9使用PKCS12(可以说是滥用),因此它只能包含证书;这是非常规的,并且AFAICT不可互操作。)

所有这些PEM文件都具有非PEM等效项,OpenSSL称其为“ DER”(尽管“ binary”可能更准确)。您可以在PEM或DER中拥有证书,但仍然是证书;您可以在PEM或DER中拥有一个密钥; PKCS12是一个例外;仅以二进制/非PEM格式支持。尽管并非所有OpenSSL命令在所有情况下都支持PEM和DER。
您的错误消息不是由于试图以非PEM格式“ -importcert”而引起的,而是由于试图以“ -importcert”非特定证书(以任何格式)引起的。这就是为什么它说“输入不是X.509证书”的原因-这意味着输入不包含证书。

通常情况下(这里很少有例外,与此处无关),SSL / TLS服务器需要私钥和证书或链;像较早的Tomcat这样的Java SSL / TLS服务器需要密钥支持和Java所支持格式的证书/链,该密钥存储库可以是JKS或PKCS12,如上所述。 (Tomcat 8.5和9将其更改为“合并” Java JSSE和APR OpenSSL的配置。)如果要导入由CA颁发的针对Java中(特别是在密钥库文件中)生成的密钥对的证书答复,则通常,您需要导入组成该链的多个证书,既可以作为单个链(通常为P7B),也可以从根节点开始分别导入;您可能一直在查看针对这种情况的说明,而不是在OpenSSL中而不是在Java密钥库中生成密钥对(以及证书)的情况。

SSL / TLS客户端OTOH仅需要信任锚证书(无密钥),通常是根CA证书。对于由“真实”(公共)CA颁发的证书,大多数客户端(包括Java)已经内置了公共根CA,但是由于您正在创建自己的CA,因此需要(仅)将CA证书分发给您的客户端)(可能会忽略忽略不正确证书的任何内容,例如 openssl s_clientcurl -k)。

最后的警告:以这种方式使用OpenSSL生成的证书(以及使用它们的服务器)将无法在Chrome 58或更高版本中使用(自2017年中开始),因为它现在需要SubjectAltNames aka SAN;看到许多关于此的现有问题。

关于java - 需要为SSL配置Tomcat 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48918713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com