使用openssl自签CA
Posted lisenMiller
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用openssl自签CA相关的知识,希望对你有一定的参考价值。
md cert;cd cert;md private
自签CA
1.生成CA的rsa密钥对
openssl genrsa -des3 -out ./private/cakey.pem 2048
#输入后弹出
Enter PEM pass phrase: 123456(输入)
Verifying - Enter PEM pass phrase: 123456(输入)
2.生成CA证书并自签发CA证书
#方法一 openssl req -new -days 365 -key ./private/cakey.pem -out careq.pem #生成CA证书请求
openssl ca -selfsign -in careq.pem -out ./crt/cacert.pem #自签发CA证书
#方法二(一条命令生成,利用-x509)
openssl req -new -x509 -days 365 -key ./private/cakey.pem -out ./crt/cacert.pem
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:cn
Locality Name (eg, city) []:cn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:cn
Organizational Unit Name (eg, section) []:cn
Common Name (e.g. server FQDN or YOUR name) []:china
Email Address []:example@163.com
此时已经创建起来了CA可以进行证书的签发
生成用户证书
1.生成用户证书RSA密钥
openssl genrsa -des3 -out ./private/userkey.pem
2.生成用户证书请求体
openssl req -new -days 365 -key ./private/userkey.pem -out uesrreq.pem
3.使用CA签发用户证书
openssl ca -in userreq.pem -out usercert.pem
方法二
1.创建根目录
C:\\Users\\9A202-1>d:
#进入到d盘
md cert
D:\\>cd cert
2.在根目录生成一个serial和index.txt文件
linux touch index.txt #空
linux touch "01" > serial
windows type nul > index.txt #空 windows `echo 01 > serial`
在创建自签证书的过程中,通过输入命令 touch "01" > serial,是为了创建一个包含设备序列号的文件。这个文件是必要的,因为该文件存储了证书颁发机构(CA)生成的每个设备的唯一标识。在为每个设备生成证书时需要使用这个唯一标识作为证书的一个字段,以确保每个设备的证书都是唯一的。通过这种方式可以防止在通讯过程中进行中人攻击。
3.修改配置文件
windows下的配置文件路径
C:\\Program Files\\Common Files\\SSL/openssl.cnf
修改三个参数
[ CA_default ]
dir =./DemoCA --> dir = D:/cert #自己创建的根路径
new_certs_dir = $dir/newcerts --> new_certs_dir = $dir/
private_key = $dir/private/cakey.pem --> private_key = $dir/cakey.pem
创建CA密钥对
openssl genrsa -out ./cakey.pem 2048
创建CA证书
openssl req -new -x509 -days 365 -key ./cakey.pem -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter \'.\', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn
State or Province Name (full name) [Some-State]:cn
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.ca.com
Email Address []:
4.创建apache的证书
D:\\cert>openssl genrsa -out ./apache/apache.key 2048
5.创建apche的证书请求
D:\\cert>openssl req -new -key ./apache/apache.key -out ./apache/apache.csr
#证书请求不需要时限 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter \'.\', the field will be left blank.
-----
Country Name (2 letter code) [AU]:cn #注意这里如果不改配置文件的话可能需要和ca的配置相同
State or Province Name (full name) [Some-State]:cn
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.skills.com
Email Address []:
Please enter the following \'extra\' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
#如果和ca的配置不一样的话可能有个报错,报错了就不生成crt了
D:\\cert>openssl ca -in ./apache/apache.csr -out ./apache/apache.crt -days 365
Using configuration from C:\\Program Files\\Common Files\\SSL/openssl.cnf
Check that the request matches the signature
Signature ok
The countryName field is different between
CA certificate (cn) and the request (AU) ##这里报错了
解决方案:可以修改openssl.cnf文件
将countryName 改成optional
sataorprovincename改成 optional
organizationanme = option
前三个修改
使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件
文章目录
操作步骤:
- 生成根CA证书并自签
- 生成二级CA证书并使用CA证书签发
- 生成服务器证书并使用二级CA证书签发
- 制作CA证书链
- 打包为p12文件
- 转化为keystore文件
1. 生成根CA证书并自签
# 创建root-ca并自签名
openssl req -x509 -newkey rsa:2048 -nodes -keyout root-ca.key -out root-ca.crt -days 3650 -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=root-ca"
# 查看创建的证书
openssl x509 -in root-ca.crt -text -noout
2. 生成二级CA证书并使用CA根证书签发
# 创建secondary-ca的证书签名请求
openssl req -new -newkey rsa:2048 -nodes -keyout secondary-ca.key -out secondary-ca.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=secondary-ca"
# 使用root-ca签发secondary-ca的证书签名请求
openssl x509 -req -in secondary-ca.csr -CA root-ca.crt -CAkey root-ca.key -CAcreateserial -out secondary-ca.crt -days 3650
# 查看创建的证书
openssl x509 -in secondary-ca.crt -text -noout
3. 生成服务器证书并使用二级CA证书签发
# 创建server的证书签名请求
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr -subj "/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=server"
# 用secondary-ca签发server的证书签名请求
openssl x509 -req -in server.csr -CA secondary-ca.crt -CAkey secondary-ca.key -CAcreateserial -out server.crt -days 3650
# 查看创建的证书
openssl x509 -in server.crt -text -noout
4. 制作CA证书链
# server.crt的签发是secondary-ca,而secondary-ca的签发是root-ca
# 对server.crt的验证必须使用到这两个证书,需要制作为证书链。
# 制作证书链的方法直白而简单:将证书拼接在一个文件中即可
cat root-ca.crt secondary-ca.crt > chain-ca.crt
5. 打包为p12文件
# 打包为p12文件
openssl pkcs12 -export -in server.crt -inkey server.key -chain -CAfile chain-ca.crt -name server -out server.p12 -password pass:changeit
# 查看生成p12文件
openssl pkcs12 -in server.p12 -password pass:changeit
# 只查看私钥
openssl pkcs12 -in server.p12 -nocerts -nodes -password pass:changeit
# 只查看客户端证书(非CA证书)
openssl pkcs12 -in server.p12 -clcerts -nokeys -password pass:changeit
# 只查看CA证书
openssl pkcs12 -in server.p12 -cacerts -nokeys -chain -password pass:changeit
执行后,将会显示三个公钥,然后要求输入密码,之后会显示私钥,总共4个文件的打包都在这个p12文件中了!内容如下:
MAC verified OK
Bag Attributes
friendlyName: server
localKeyID: 9B 11 E1 8F 2C E9 A6 09 9A B9 BC 7B 06 1A 43 E9 C5 C8 B6 5A
subject=/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=server
issuer=/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=secondary-ca
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
Bag Attributes: <No Attributes>
subject=/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=secondary-ca
issuer=/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=root-ca
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
Bag Attributes: <No Attributes>
subject=/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=root-ca
issuer=/C=CN/ST=shanghai/L=shanghai/O=example/OU=it/CN=root-ca
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
Bag Attributes
friendlyName: server
localKeyID: 9B 11 E1 8F 2C E9 A6 09 9A B9 BC 7B 06 1A 43 E9 C5 C8 B6 5A
Key Attributes: <No Attributes>
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----BEGIN ENCRYPTED PRIVATE KEY-----
....
-----END ENCRYPTED PRIVATE KEY-----
6. 转化为keystore文件
# 将server.p12转化为server.jks
keytool -importkeystore -deststorepass changeit -destkeystore server.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass changeit -noprompt
#查看keystore文件
keytool -list -v -keystore server.jks -v -storepass changeit
#查看keystore文件 (rfc 格式)
keytool -list -rfc -keystore server.jks -storepass changeit
要注意的是:
- server.jks只有一个entry:server
- 这个entry的类型是:Entry type: PrivateKeyEntry
对于PrivateKeyEntry类型要特别解释一下:该类型的官方解释是:它包含一个密钥,这个密钥是加密的,查看时也不会显示,也不能导出,但要清楚的是,这个私钥是实实在在存在。同时,它还会包含这个私钥对应的证书链!所以,转成server.jks的文件是包含了server.p12中的全部信息:一个私钥+3个证书组成的证书链!
参考Java官方文档: https://docs.oracle.com/javase/6/docs/api/java/security/KeyStore.html
最后:既然keystore文件无法导出密钥,一般的处理方法是先将其转为p12文件,然后就可以导出密钥了!
7. 注意事项
在第5步中,如果给-CAfile
传入的不是root-ca.crt
和secondary-ca.crt
拼接后chain-ca.crt
文件,而是给server.crt
直接授权的secondary-ca.crt
文件,命令行将会报错:
Error unable to get issuer certificate getting chain.
8. 使用openssl x509
和openssl ca
签发CA证书的差别
使用openssl x509
和使用openssl ca
没有本质差别,openssl ca
使用的配置文件,文件中配置固定的index.txt和serial文件,来记录签发过的证书,确保不会重复签发。如果把当前服务器作为专门的CA签发机构,使用openssl ca
及其关联的配置文件会更好一些。如果只是命令行临时生成一下,用openssl x509
完全可以满足需求。
此外,从测试来看,openssl x509
签发的只能是v1版本的,即使加了-extensions v3_ca也无效,但是openssl ca -extensions v3_ca
签发出来的就是v3版本的。
以上是关于使用openssl自签CA的主要内容,如果未能解决你的问题,请参考以下文章
使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件
使用OpenSSL创建多级CA证书链签发证书并导出为pkcs12/p12/pfx文件