一、生成CA根证书
生成 CA 私钥:openssl genrsa -out ca.key 1024
因为是自签名,省略生成 证书签名请求csr 的过程,直接执行以下命令生成CA证书:openssl req -new -x509 -days 365 -key ca.key -out ca.crt
注:-days 365 指定有效期,
查看证书有效期:openssl x509 -in server.crt -noout -dates
二、每个证书持有人(Client、Server)都有一对公钥、私钥
Server端
(1)生成 服务器端 私钥:openssl genrsa -out server.key 1024
(2)利用 服务器端 私钥导出公钥:openssl rsa -in server.key -pubout -out server.pub.key
【用不上,可以不执行】
Client端
(1)生成 客户端 私钥:openssl genrsa -out client.key 1024
(2)生成 携带密码的客户端 私钥,用-des3
加密:openssl genrsa -des3 -out client.key 1024
注:生成私钥可以指定私钥密码
(3)利用 客户端 私钥导出公钥:openssl rsa -in client.key -pubout -out client.pub.key
【用不上,可以不执行】
三、使用自签名的CA根证书签发Client、Server的数字证书
Server端
(1)向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR(证书签名请求) 文件:openssl req -new -key server.key -out server.csr -days 365
(2)向自己的 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的数字证书:openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt -days 365
Client端
(1)生成证书签名请求client.csr:openssl req -new -key client.key -out client.csr -days 365
(2)对上一步的 证书签名请求 进行签名,颁发一个带有CA签名的数字证书:openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt -days 365
查看证书信息:
openssl x509 -in server.crt -noout -text
openssl x509 -in client.crt -noout -text
openssl x509 -in CA.crt -noout -text
查看client证书中的公钥信息:
openssl x509 -in client.crt -pubkey
查看server证书中的公钥信息:
openssl x509 -in server.crt -pubkey
生成客户端证书安装包:
将客户端证书文件client.crt和客户端证书密钥文件client.key,合并成客户端证书安装包client.pfx
(使用server.crt、server.key也是一样的,只要是服务器使用的CA证书签发的都可以)
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
openssl pkcs12 -export -in server.crt -inkey server.key -out server.pfx
成后点击client.pfx,安装到浏览器证书中(一直点击“下一步”)这样在浏览器中就可以https访问服务器
生成自定义证书(证书+私钥 格式):
ca.crt文件和ca.key可以合到一个文件里面,把2个文件合成了一个ca.crt.key.pem文件(直接拷贝过去就行了)
即手动生成了一个自定义证书(Windows下在拷贝时,需要将文档末尾空余一行)
cat ca.crt ca.key > ca.crt.key.pem
cat client.crt client.key > client.crt.key.pem
cat server.crt server.key > server.crt.key.pem
四、生成CSR示例
下表可帮助您创建证书请求。
Name | 姓名 | 描述 | 示例 |
---|---|---|---|
Country Name | 国家名称 | 代表国家的两个字母 ISO 缩写。 | CN(中国) |
State or Province Name | 州或省 | 组织所在州或省的名称。此名称不可使用缩写。 | ZJ(浙江) |
Locality Name | 所在地名称 | 组织所在城市的名称。 | HZ(杭州) |
Organization Name | 组织名称 | 组织的法定全称。请勿缩写组织名称。 | 百度、腾讯、网易 |
Organizational Unit Name | 组织部门 | 可选,用于提供额外的组织信息。 | 开发、测试、市场营销 |
Common Name | 公用名 | 别名记录的完全限定域名。如果两者不能精确匹配,那么您会收到一条证书名称检测警告。 | www.yourdomain.com |
Email Address | 电子邮件地址 | 服务器管理员的电子邮件地址 | someone@yourdomain.com |
➜ keys openssl req -new -key ca.key -out ca.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
State or Province Name (full name) [Some-State]:ZJ
Locality Name (eg, city) []:HZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:My CA
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:apache.com
/192.168.125.175
Email Address []:
注意
Organization Name :CA、客户端、服务器端的CSR文件的这一项不要写成一样的!!!可以随意写如:My CA, My Server, My Client
Common Name:这一项,是可以访问的域名,也可以配置为IP
【“验证域名”功能,验证的就是这个!!!!】
五、扩展
根据不同编码查看私钥方式如下:
PEM 编码格式:openssl rsa -in xxx.key -text -noout
DER 编码格式:openssl rsa -in xxx.key -text -noout -inform der
同一 X.509 证书的不同编码之间可以互相转换:
PEM 转为 DER:openssl x509 -in xxx.pem -outform der -out xxx.der
DER 转为 PEM:openssl x509 -in xxx.der -inform der -outform pem -out xxx.pem
六、一些概念说明
CA(Certification Authority)证书
如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。 CSR
在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。(CRT,证书含公钥)
CA证书即CA颁发的证书,包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。
CA证书(数字证书)由证书认证机构(CA)对证书申请者真实身份验证之后,用CA的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。CA证书(数字证书)就是经过CA认证过的公钥。
公钥、私钥
在 RSA 中有「公钥」和「私玥」两种密钥,其中私钥可以导出公钥,但公钥无法反推私钥
私钥一般情况都是由证书持有者在自己本地生成的,由证书持有者自己负责保管
签名加密、解密
签名:CA用私钥给服务签发证书,证书中携带签名,CA用公钥验证这个签名是否是我签发的
传输加密、解密
传输:用接收方提供的的证书(相当于公钥)对需要发送给对方的数据进行加密,接收方用自己的私钥对接收到的数据进行解密。
因此,如果说数字证书是电子商务应用者的网上数字身份证话,那么证书相应的私钥则可以说是用户的私章或公章