使用keytool与openssl创建Tomcat证书

1级自签名证书的创建

使用openssl创建证书:
1.创建rsa私钥,并使用des3对私钥加密(-des3),如果没有-des3参数将不对私钥加密
openssl genrsa -des3 -out ./serverkey-pkcs1_p123456.pem 1024
输入通行密语123456后生成serverkey-pkcs1_p123456.pem文件,文件格式是PKCS1(BEGIN RSA PRIVATE KEY),
java支持通用PKCS8(BEGIN PRIVATE KEY),公钥java需要x509格式。
    
删除私钥的通行密语:
openssl rsa -in serverkey-pkcs1_p123456.pem -out serverkey-pkcs1.pem
    输入123456通行密语后会删除通行密语,将私钥保存到serverkey-pkcs1.pem
  
java默认使用pkcs8格式私钥,可以通过openssl进行转换:
openssl pkcs8 -topk8 -in serverkey-pkcs1.pem -out serverkey-pkcs8.pem -nocrypt
            
同理生成公钥(公钥pkcs1与pkcs8一样):
openssl rsa -in serverkey-pkcs1.pem -pubout -out serverPubkey-pkcs8.pem
    
查看密钥信息(https://www.cnblogs.com/jukan/p/5527922.html)
使用openssl rsa -in serverkey-pkcs1.pem -text -noout查看密钥信息RSAPublicKeySpec(-noout直接打印)

 

2.创建服务器x509证书:
openssl req -new -x509 -days 10240 -key serverkey-pkcs1.pem  -out servercert-x509.pem -subj '/C=CN/ST=someState/L=localName/O=Tomcat_org/OU=Tomcat_ornUnit/CN=10.41.152.89/emailAddress=email'
这里没有使用openssl ca进行签发,表示是自签名
 -x509代表x509结构的证书。Common Name(CN)必须,代表服务器ip或主机名。
 
 查看证书:
    openssl x509 -in servercert-x509.pem -noout -text

 

3.将证书servercert-x509.pem(公钥证书,只有公钥)转换为PKCS12(含有私钥,同时可以有公钥,有口令保护)格式,并指定保护证书的别名为tomcat
openssl pkcs12 -export -in servercert-x509.pem -inkey serverkey-pkcs1.pem -out servercert_atomcat_p1234567.p12 -name "tomcat"
指定导出p12 keystore的保护密语1234567,这里指定了证书友好名为tomcat(可以不指定,不使用-name)与jks的alias(别名)一致

 

4.使用java自带的keytool将PKCS12证书servercert.p12转换为tomcat支持的jks
keytool -importkeystore -srckeystore servercert_atomcat_p1234567.p12 -srcstoretype pkcs12 -deststoretype jks -destkeystore servercert_atomcat_p12345678.jks
输入生成的jks证书文件的通行密语12345678,然后输入pkcs12证书的通行密语1234567。此时生成的jks里面包含一个tomcat别名的PrivateKeyEntry(包含私钥和证书)
并且保护密码是p12的保护密码1234567

使用命令keytool  -v -list -keystore servercert_atomcat_p12345678.jks查看jks证书

5.tomcat8配置证书
 a.将servercert_atomcat_p12345678.jks放到$tomcat_home/conf/mycert目录下
 b.打开server.xml
    在SSLHostConfig/Certificate节点中添加属性参数:
        certificateKeystoreFile="conf/mycert/servercert_atomcat_p12345678.jks" //jks文件
        certificateKeystorePassword="12345678" //jks文件通行密语
        certificateKeyPassword="1234567" //证书密码
        certificateKeyAlias="tomcat"   //证书私钥别名

 

2级证书链的创建

1.创建ca私钥,并指定通行密语为123456
openssl genrsa -des3 -out ./cakey-pkcs1_p123456.pem 1024
去除私钥保护密码:
openssl rsa -in cakey-pkcs1_p123456.pem -out cakey-pkcs1.pem
2.创建ca自签名根证书,并指定签名算法sha256
openssl req -new -x509 -days 10240 -sha256 -key cakey-pkcs1.pem -out cacert-x509.pem -subj '/C=CN/ST=testState/O=Tomcat_org/CN=Tomcat CA'

3.将ca根证书导出为p12格式,用于谷歌浏览器证书导入,火狐与谷歌都可以直接用cacert.pem进行导入,
浏览器使用p12主要是用于客户端证书(浏览器证书类型:个人/您的证书),此证书包含密钥。如果只是验证服务端的证书是否合法
无需包含密钥,使用cacert-x509.pem,导入到浏览器即可(浏览器证书类型:受信任的根、中证书机构/证书颁发机构)
指定导出p12证书的通行密语1234567
openssl pkcs12 -export -in cacert-x509.pem -inkey cakey-pkcs1.pem -out cacert_aca_p1234567.p12 -name "ca"

4.创建服务端私钥,并指定通行密语为123456
openssl genrsa -des3 -out ./serverkey-pkcs1_p123456.pem 1024

删除私钥的通行密语:
openssl rsa -in serverkey-pkcs1_p123456.pem -out serverkey-pkcs1.pem
    输入123456通行密语后会删除通行密语,将私钥保存到serverkey-pkcs1.pem
java默认使用pkcs8格式私钥,可以通过openssl进行转换:
openssl pkcs8 -topk8 -in serverkey-pkcs1.pem -out serverkey-pkcs8.pem -nocrypt


6.生成服务端证书请求,openssl默认要求C,ST,O必须和cacert.pem的一致,CN必须为当前服务器的域名或IP,不包括端口号。
openssl req -new -days 10240 -key serverkey-pkcs1.pem -out servercert.csr -subj '/C=CN/ST=testState/O=Tomcat_org/CN=10.41.152.89'

7.使用ca根证书签发服务器证书,指定签名算法sha256。
openssl ca -md sha256 -in servercert.csr -out servercert-x509.pem -cert cacert-x509.pem -keyfile cakey-pkcs1.pem

如果报错:
I am unable to access the ./demoCA/newcerts directory
则执行如下命令:
mkdir -p ./demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
echo 01 > demoCA/serial
touch demoCA/index.txt.attr
echo unique_subject =no > demoCA/index.txt.attr
这一行目的允许同一主题证书的创建

8.将服务端证书导出为p12格式,指定导出证书的通行密语1234567,保护证书的别名指定为tomcat
openssl pkcs12 -export -in servercert-x509.pem -inkey serverkey-pkcs1.pem -out servercert_atomcat_p1234567.p12 -name "tomcat"

9.使用java自带的keytool将PKCS12证书转换为tomcat支持的jks(jdk其实也支持p12的keystore)
输入生成的jks证书文件的通行密语12345678,然后输入pkcs12证书的通行密语1234567。
keytool -importkeystore -srckeystore servercert_atomcat_p1234567.p12 -srcstoretype pkcs12 -deststoretype jks -destkeystore servercert_atomcat_p12345678.jks

服务器要进行双向认证需要创建客户端证书
10.创建客户端私钥,并输入通行密语为123456
openssl genrsa -des3 -out ./clientkey-pkcs1_p123456.pem 1024
去除私钥保护密码:
openssl rsa -in clientkey-pkcs1_p123456.pem -out clientkey-pkcs1.pem

11.生成客户端证书请求,openssl默认要求C,ST,O必须和cacert.pem的一致
openssl req -new -days 10240 -key clientkey-pkcs1.pem -out clientcert.csr -subj '/C=CN/ST=testState/O=Tomcat_org/CN=Tomcat Client'

12.使用ca根证书签发客户端证书,指定签名算法sha256。
openssl ca -md sha256 -in clientcert.csr -out clientcert-x509.pem -cert cacert-x509.pem -keyfile cakey-pkcs1.pem

13.将客户端证书导出为p12格式,用于浏览器导入(此证书是带有私钥的,因此才满足客户证书要求),需要输入通行密语123456,
并指定导出证书的通行密语1234567,证书私钥的别名指定为client,不过别名似乎对浏览器导入没有用处
openssl pkcs12 -export -in clientcert-x509.pem -inkey clientkey-pkcs1.pem -out clientcert_aclient_p1234567.p12 -name "client"

13.是用keytool创建服务端truststore,并输入keystore密码12345678,这里导入的是ca根证书
keytool -importcert -trustcacerts -file cacert-x509.pem -keystore truststore-ca_p12345678.jks

tomcat配置样例:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
    <SSLHostConfig certificateVerification="required" truststoreFile="conf/mycert/c2/truststore-ca_p12345678.jks" truststorePassword="12345678">
        <Certificate certificateKeystoreFile="conf/mycert/c2/servercert_atomcat_p12345678.jks" certificateKeystorePassword="12345678" certificateKeyAlias="tomcat"
                    certificateKeyPassword="1234567"
                     type="RSA" />
    </SSLHostConfig>
</Connector>
狐火导入CA证书:选项-》隐私与安全-》-》查看证书-》证书颁发机构-》导入cacert-x509.pem
狐火导入客户证书:选项-》隐私与安全-》-》查看证书-》您的证书-》导入clientcert_aclient_p1234567.p12并输入通行密语1234567

使用curl请求:
curl --cert ./clientcert-x509.pem --key ./clientkey-pkcs1.pem --cacert ./cacert-x509.pem  https://10.41.152.89:8443/test/testServlet
如果客户端证书私钥存在保护密语则需要在证书名后面使用":"号加密语方式如clientcert-x509.pem:123456,
代表使用客户端验证的客户端证书是clientcert-x509.pem,且此证书的clientkey-pkcs1.pem的通行密语是123456

 

3级证书链的创建

 

1.创建ca私钥,并指定通行密语为123456
openssl genrsa -des3 -out ./rootcakey-pkcs1_p123456.pem 1024
去除私钥保护密码:
openssl rsa -in rootcakey-pkcs1_p123456.pem -out rootcakey-pkcs1.pem

2.创建ca自签名根证书,并指定签名算法sha256
openssl req -new -x509 -days 10240 -sha256 -key rootcakey-pkcs1.pem -out rootcacert-x509.pem -subj '/C=CN/ST=testState/O=Tomcat_org/CN=Tomcat Root CA'

3.将ca根证书导出为p12格式,用于谷歌浏览器证书导入,p12格式包含私钥用于服务端验证的客户端个人证书的场景。
而作为验证服务端,无需私钥的ca根证书使用pem格式就可以,火狐与谷歌都可以直接用cacert.pem进行导入。

将ca根证书导出为p12格式,并指定导出p12证书的通行密语1234567
openssl pkcs12 -export -in rootcacert-x509.pem -inkey rootcakey-pkcs1.pem -out rootcacert_arootca_p1234567.p12 -name "rootca"

4创建中级ca私钥,并指定通行密语为123456
openssl genrsa -des3 -out ./secondcakey-pkcs1_p123456.pem 1024
去除私钥保护密码:
openssl rsa -in secondcakey-pkcs1_p123456.pem -out secondcakey-pkcs1.pem

5.生成中级证书请求,openssl默认要求C,ST,O必须和rootcakey.pem的一致,输入中级密钥的通行密语123456
openssl req -new -days 10240 -key secondcakey-pkcs1.pem -out secondcacert.csr -subj '/C=CN/ST=testState/O=Tomcat_org/CN=Tomcat Second CA'

6.使用ca根证书签发中级证书,指定签名算法sha256,需输入rootcakey的通行密语123456
openssl ca -extensions v3_ca -md sha256 -in secondcacert.csr -out secondcacert-x509.pem -cert rootcacert-x509.pem -keyfile rootcakey-pkcs1.pem
-extensions v3_ca参数代表此中级证书可以签发子证书
如果报错:
I am unable to access the ./demoCA/newcerts directory
则执行如下命令:
mkdir -p ./demoCA/newcerts
touch demoCA/index.txt
touch demoCA/serial
echo 01 > demoCA/serial
touch demoCA/index.txt.attr
echo unique_subject =no > demoCA/index.txt.attr
这一行目的允许同一主题证书的创建

7.将ca中级证书导出为p12格式指定导出p12证书的通行密语1234567
openssl pkcs12 -export -in secondcacert-x509.pem -inkey secondcakey-pkcs1.pem -out secondcacert_asecondca_p1234567.p12 -name "secondca"

8.创建服务端私钥,并指定通行密语为123456
openssl genrsa -des3 -out ./serverkey-pkcs1_p123456.pem 1024
去除私钥保护密码:
openssl rsa -in serverkey-pkcs1_p123456.pem -out serverkey-pkcs1.pem
java默认使用pkcs8格式私钥,可以通过openssl进行转换:
openssl pkcs8 -topk8 -in serverkey-pkcs1.pem -out serverkey-pkcs8.pem -nocrypt

9.生成服务端证书请求,CN必须为当前服务器的域名或IP,不包括端口号。
openssl req -new -days 10240 -key serverkey-pkcs1.pem -out servercert.csr -subj '/C=CN/ST=testState/O=Tomcat_org/CN=10.41.152.89'

10.使用ca中级证书签发服务器证书,指定签名算法sha256。
openssl ca -md sha256 -in servercert.csr -out servercert-x509.pem -cert secondcacert-x509.pem -keyfile secondcakey-pkcs1.pem

11.将服务端证书导出为p12格式,并指定导出证书的通行密语1234567
证书私钥的别名指定为tomcat
openssl pkcs12 -export -in servercert-x509.pem -inkey serverkey-pkcs1.pem -out servercert_atomcat_p1234567.p12 -name "tomcat"

12.使用java自带的keytool将PKCS12证书转换为jks
输入生成的jks证书文件的通行密语12345678,然后输入pkcs12证书的通行密语1234567。
keytool -importkeystore -srckeystore servercert_atomcat_p1234567.p12 -srcstoretype pkcs12 -deststoretype jks -destkeystore servercert_atomcat_p12345678.jks


部署时,浏览器需要导入两个证书:rootcacert-x509.pem和secondcacert-x509.pem后方可访问https地址,还有个方法就是浏览器只
导入rootcacert-x509.pem,此时服务器的jks的tomcat别名必须是包含两个证书的证书链,一个是servercert-x509.pem证书,另一个是
secondcacert-x509.pem证书,此时浏览器访问https时,服务端会将自身的证书以及中级证书发送给浏览器。
keytool好像同一个alias无法添加多个证书,因此可以使用openssl创建p12文件再用keytool转为为jks:
openssl pkcs12 -export -in servercert-x509.pem -inkey serverkey-pkcs1.pem -certfile secondcacert-x509.pem -out servercert_c2serverAndSecondca_atomcat_p1234567.p12 -name tomcat
创建证书链:并指定服务器证书,以及要追加的证书secondcacert-x509.pem,别名是tomcat,并指定导出通行密语1234567

keytool -importkeystore -srckeystore servercert_c2serverAndSecondca_atomcat_p1234567.p12 -srcstoretype pkcs12 -deststoretype jks -destkeystore servercert_c2serverAndSecondca_atomcat_p1234568.jks
将p12格式转换为jks格式,指定jks的保护密语12345678并输入源p12证书的通行密语1234567


服务器要进行双向认证需要创建客户端证书
13.创建客户端私钥,并输入通行密语为123456
openssl genrsa -des3 -out ./clientkey-pkcs1_p123456.pem 1024
去除私钥保护密码:
openssl rsa -in clientkey-pkcs1_p123456.pem -out clientkey-pkcs1.pem

14.生成客户端证书请求,openssl默认要求C,ST,O必须和secondcacert.pem的一致
openssl req -new -days 10240 -key clientkey-pkcs1.pem -out clientcert.csr -subj '/C=CN/ST=testState/O=Tomcat_org/CN=Tomcat Client'


15.使用ca中级证书签发客户端证书,指定签名算法sha256。
openssl ca -md sha256 -in clientcert.csr -out clientcert-x509.pem -cert secondcacert-x509.pem -keyfile secondcakey-pkcs1.pem

16.将客户端证书导出为p12格式,用于浏览器导入(此证书是带有私钥的,因此才满足客户证书要求)。指定导出证书的通行密语1234567,证书私钥的别名指定为client
openssl pkcs12 -export -in clientcert-x509.pem -inkey clientkey-pkcs1.pem -out clientcert_aclient_p1234567.p12 -name "client"

17.用keytool创建服务端truststore,并输入keystore密码12345678,这里导入的是rootca根证书与secondca中级证书
keytool -importcert -trustcacerts -file rootcacert-x509.pem -keystore truststore_c2rootAndSecondcacert_p1234568.jks -alias rootca
keytool -importcert -trustcacerts -file secondcacert-x509.pem -keystore truststore_c2rootAndSecondcacert_p1234568.jks -alias secondca

tomcat配置样例:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
    <SSLHostConfig certificateVerification="required" truststoreFile="conf/mycert/c3/truststore_c2rootAndSecondcacert_p1234568.jks" truststorePassword="12345678">
        <Certificate certificateKeystoreFile="conf/mycert/c3/servercert_c2serverAndSecondca_atomcat_p1234568.jks" certificateKeystorePassword="12345678" certificateKeyAlias="tomcat"
                    certificateKeyPassword="1234567"
                     type="RSA" />
    </SSLHostConfig>
</Connector>

狐火导入CA证书:选项-》隐私与安全-》-》查看证书-》证书颁发机构-》导入 rootcacert-x509.pem
狐火导入客户证书:选项-》隐私与安全-》-》查看证书-》您的证书-》导入 clientcert_aclient_p1234567.p12并输入通行密语1234567

针对curl访问https时如何指定多个ca证书,好像--cacert参数不支持多个文件,使用如下命令转:
 openssl crl2pkcs7 -certfile rootcacert-x509.pem  -certfile secondcacert-x509.pem  -outform PEM -out ca_chain.p7b -nocrl
 openssl pkcs7 -print_certs -in ca_chain.p7b -out ca_chain.pem
 或者直接合并:
 cat rootcacert-x509.pem secondcacert-x509.pem > ca_chain.pem
 curl  "https://10.41.152.89:8443/test/testServlet" --cacert ca_chain.pem
 --cacert ca_chain.pem代表客户验证服务端的根证书
如果服务端要验证客户端,那么客户端要提供证书使用--cert参数,如:
curl https://10.41.152.89:8443/test/testServlet -k --cert ./clientcert-x509.pem --key ./clientkey-pkcs1.pem
-k不进行服务端验证。

同时验证:
curl https://10.41.152.89:8443/test/testServlet  --cert ./clientcert-x509.pem --key ./clientkey-pkcs1.pem --cacert ./rootcacert-x509.pem


密钥库文件格式【Keystore】

 

 格式     :  JKS
 扩展名  : .jks/.ks
 描述     : 【Java Keystore】密钥库的Java实现版本,provider为SUN
 特点     :  密钥库和私钥用不同的密码进行保护
 
 格式     :  JCEKS
 扩展名  :  .jce
 描述     : 【JCE Keystore】密钥库的JCE实现版本,provider为SUN JCE
 特点     :  相对于JKS安全级别更高,保护Keystore私钥时采用TripleDES
 
 格式     :  PKCS12
 扩展名  :  .p12/.pfx
 描述     : 【PKCS #12】个人信息交换语法标准
 特点     :  1、包含私钥、公钥及其证书
               2、密钥库和私钥用相同密码进行保护
 
 格式     :  BKS
 扩展名  : .bks
 描述     :  Bouncycastle Keystore】密钥库的BC实现版本,provider为BC
 特点     :  基于JCE实现
 
 格式     : UBER
 扩展名  : .ubr
 描述     : 【Bouncycastle UBER Keystore】密钥库的BC更安全实现版本,provider为BC


证书文件格式【Certificate】


格式          :  DER
扩展名       :  .cer/.crt/.rsa

描述          : 【ASN .1 DER】用于存放证书
特点          :  不含私钥、二进制

 

格式          :  PKCS7
扩展名       : .p7b/.p7r
描述          : 【PKCS #7】加密信息语法标准

特点          : 1、p7b以树状展示证书链,不含私钥
                  2、p7r为CA对证书请求签名的回复,只能用于导入

 

格式          :  CMS
扩展名       :  .p7c/.p7m/.p7s
描述          : 【Cryptographic Message Syntax】
特点          : 1、p7c只保存证书
                  2、p7m:signature with enveloped data
                  3、p7s:时间戳签名文件
 
格式          :  PEM
扩展名       : .pem
描述          : 【Printable Encoded Message】
特点          : 1、该编码格式在RFC1421中定义,其实PEM是【Privacy-Enhanced Mail】的简写,但他也同样广泛运用于密钥管理
                  2、ASCII文件
                  3、一般基于base 64编码

 

格式         :  PKCS10
扩展名      : .p10/.csr
描述         : 【PKCS #10】公钥加密标准【Certificate Signing Request】
特点         :  1、证书签名请求文件
                  2、ASCII文件
                  3、CA签名后以p7r文件回复

 

格式         :  SPC
扩展名      : .pvk/.spc
描述         : 【Software Publishing Certificate】
特点         :  微软公司特有的双证书文件格式,经常用于代码签名,其中
                  1、pvk用于保存私钥
                  2、spc用于保存公钥

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值