天天看点

openssl和keytool制证(tomcat ssl配置)

编译好openssl就可以使用了。

生成CA跟证书与私钥

req -new -x509 -keyout ca.key -out ca.crt -days 365 -config openssl.cnf

这样我们就得到了私钥文件ca.key ca根证书ca.crt。openssl.cnf可以去官网下载 不过它是适合linux系统的,需要修改 ,全部改成双//。

利用keytool生成证书请求。

首先说明几个概念: keytool 将密钥和证书储存在一个所谓的密钥仓库中。 在密钥仓库中有两种不同类型的项:

密钥项 : 每项存放极为敏感的加密密钥信息,这种信息以一种受保护的格式储存以防止未授权的访问。通常,储存在这类项中的密钥是机密密钥,或是伴有用于认证相应公钥用的证书“链”的私钥。 keytool 只处理后一类型的项,即私钥及其关联的证书链。

可信任的证书项 : 每项包含一个属于另一团体的公钥证书。它之所以叫做“可信任的证书”,是因为密钥仓库的拥有者相信证书中的公钥确实属于证书“主体”(拥有者)识别的身份。证书签发人通过对证书签名来保证这点。

对所有的密钥仓库项(密钥项和可信任的证书项)的访问都要通过唯一的别名来进行。别名不区分大小写,即别名 SHECA 和 sheca 指的是同一密钥仓库项。

       当用 -genkey 命令来生成密钥对(公钥和私钥)或用 -import 命令来将证书或证书链加到可信任证书的清单中,以增加一个实体到密钥仓库中,必须指定了一个别名。后续 keytool 命令必须使用这一相同的别名来引用该实体。

     当第一次产生密钥时,链中只含有一个元素,即自签名证书。自签名证书是一个这样的证书:其签发人(签名人)与主体(证书所认证的公钥所属的实体)相同。当调用 -genkey 命令来生成新的公钥/私钥对时,他同时也把公钥打包进自签名证书中(在对应的密钥仓库中)。

  之后,当证书签名请求 (CSR) 被生成并送至认证机构 (CA) 后, CA 的答复将被导入,证书链将取代自签名证书。在链的底部是认证主体公钥的 CA 所发放的证书(答复)。链中下一个证书是用于认证 CA 公钥的证书。(证书链一般是pkcs7格式的) 生成密钥对

keytool -genkey -alias server -keyalg rsa -validity 365 -keystore d:/server.keystore

生成证书请求

keytool -certreq -alias server -file server.csr -keystore d:/server.keystore

利用openssl对server.csr签名

openssl ca -in d:/server.csr -out server.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf

直接这样会报错,主要是因为openssl.cnf配置文件的原因。打开这个配置文件,你会看到里面有很多目录,你需要创建对应的目录结构,创建demoCA文件夹以及其子文件newcerts ,文件index.txt、 serial。 如果这样还是会报错 ,需要注释掉配置文件中的#x509_extensions = x509v3_extensions 

签名后就可以将根证书ca.crt和签好名都server.crt导入到keytool的受信任的仓库truts.keystore

keytool -import -v -trustcacerts -alias ca_root -file ca.crt -keystore d:/ trust .keystore

可以先将CA的根证书ca.crt导入到server.keystore中 在导入server.crt试试看能不能取代密钥仓库原有的证书链。取代上面括号中的 keytool -import -v -alias caroot -file ca.crt -keystore d:/server.keystore keytool -import -v - trustcacerts  -alias server -file server.crt -keystore d:/server.keystore

记得有2个密钥仓库,一个也可以,但是配置中有2个。

然后在tomcat的server.xml中配置

<Connector port="8443" maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

enableLookups="false" disableUploadTimeout="true"

acceptCount="100" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS" keystoreFile="d:/server.keystore" keystorepass="123456"

truststoreFile="d:/trust.keystore" truststorePass="123456"/>