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用于保存公钥