根证书一般情况用来签发中间证书,再由中间证书签发终端证书(服务端、客户端)
SSL 证书通过在客户端浏览器和 Web 服务器之间建立一条 SSL 安全通道(Secure socket layer(SSL)安全协议是由 Netscape Communication 公司设计开发。该安全协议主要用来提供对用户和服务器的认证;对传送的数据进行加密和隐藏;确保数据在传送中不被改变,即数据的完整性,现已成为该领域中全球化的标准。
1、自签 SSL 证书最容易被假冒和伪造,被欺诈网站利用
2、部署自签 SSL 证书的网站,浏览器会弹出警告(可以通过安装根证书和中间证书解决)
3、自签 SSL 证书最容易受到 SSL 中间人攻击
4、自签 SSL 证书没有可访问的吊销列表
……
自签根证书的建立(ROOT_CA)
1、创建根证书文件夹
在根目录下建立一个/ca 文件夹,用于存放后面要建立的一系列证书(根证书、中间证书、终端证书的相关目录文件夹都存放在这个目录下)
cd / mkdir ca
2、创建一个 root 文件夹,用于存放根证书的文件
cd ca mkdir root
3、进入 root 目录,建立相关的目录
cert 目录存放根证书
signed_certs 目录存放根证书签发过的证书的副本
改变 private 目录的权限:管理员可以读、写、进入目录,其他人没有任何权限访问这个目录
cd /ca/root mkdir private cert signed_certs chmod 700 private
4、建立相关的记录文件
建立 serial,被签发的证书都会有序号的栏位,纪录此证书在上一层签发单位所签发的证书的序号,此档案会用来纪录中间证书签发的证书的序号,每次中间证书签发证书 OpenSSL 会自动更新此档案
将序号 0001 写入 serial 文件,代表这是第一次签发证书
touch index.txt touch serial echo 0001 > serial
index.txt.att*
文件时,请返回目录创建此文件 touch index.txt.att*
5、创建根证书设定档
填写 OpenSSL 需要的设定档,文件名是 openssl_root_ca.cnf,并放置在 root 目录内,内容如下:
touch openssl_root_ca.cnf
然后使用 winscp 访问这个文件,填入下面的内容
[ ca ] default_ca = CA_default [ CA_default ] # 放置相关的档案和目录 dir = /ca/root certs = $dir/cert new_certs_dir = $dir/signed_certs database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand # 放置私钥和凭证的路径 private_key = $dir/private/root_ca.key.pem certificate = $dir/cert/root_ca.cert.pem default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 365 preserve = no policy = policy_defualt [ policy_defualt ] # 签发中继凭证时资料的检查(是否必须和根凭证一样). countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] # req 工具需要的参数. default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 [ req_distinguished_name ] # 产生凭证时要输入的资料的说明. countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address [ root_ca ] # 签发根凭证使用. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ intermediate_ca ] # 签发中继凭证使用. subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign
6、创建根证书秘钥
在 root 目录的 private 目录下建立一个 root_ca.key.pem 文件
该文件为根证书的私钥文件(本文的所有私钥文件均不加密,因此删除了加密方式-aes256
参数)
openssl genrsa -out private/root_ca.key.pem 4096
7、使用根证书设定档创建根证书
在 root 目录下的 cert 目录下建立一个名为 root_ca.cert.pem 的文件,该文件即为证书
证书的有效期为 7200 天,私钥为 root_ca.key.pem 文件,配置文件为 openssl_root_ca.cnf
openssl req -config openssl_root_ca.cnf -new -x509 -days 7200 -sha256 -extensions root_ca -key private/root_ca.key.pem -out cert/root_ca.cert.pem
所在的国家的缩写,2 个字母,例如 China = CH,Unit State = US
所在的州或省
所在的城市
所在的公司
所在的公司的单位
凭证的名称
联络信箱
8、检查自签的根证书的相关信息以及是否有误
openssl x509 -noout -text -in cert/root_ca.cert.pem
中间证书的建立
1、创建中间证书相关目录
进入/ca 目录,建立一个 intermediate 目录,并进入 intermediate 目录
cd /ca mkdir intermediate cd intermediate
2、建立中间证书的相关目录和档案
private:存放中间证书的私钥
csr:存放中间证书的证书签发申请档
cece:存放中间证书
chain:存放中间证书的证书串链
signed_certs:存放中间证书签发过的证书的副本
改变存放私钥的目录存取权限
mkdir private csr cert chain signed_certs chmod 700 private
3、建立相关记录文档
建立 serial,并在档案中填入 0001,被签发的证书都会有序号的栏位,纪录此证书在上一层签发单位所签发的证书的序号,此档案会用来纪录根证书签发的证书的序号,每次根证书签发证书 OpenSSL 会自动更新此档案
将序号 0001 写入 serial 文件,代表这是第一个签证的中间证书
touch index.txt touch serial echo 0001 > serial
4、填写 OpenSSL 需要的设定档
档名是 openssl_intermediate_ca.cnf,并放置在 intermediate 目录内,内容如下:
touch openssl_intermediate_ca.cnf
[ ca ] default_ca = CA_default [ CA_default ] #放置相关的档案和目录 dir = /ca/intermediate certs= $dir/cert new_certs_dir = $dir/signed_certs database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand #放置私人和凭证的路径 private_key = $dir/private/intermediate_ca.key.pem certificate = $dir/cert/intermediate_ca.cert.pem default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 365 preserve = no policy = policy_defualt [ policy_defualt ] countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] #req 工具需要的参数 default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 [ req_distinguished_name ] #产生凭证时要输入的资料的说明 countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address [ server_cert ] #签发服务端证书使用 basicConstraints = CA:FALSE nsCertType = server nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ client_cert ] #签发客户端证书使用 basicConstraints = CA:FALSE nsCertType = client, email nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, emailProtection
如果你想给你的服务端证书添加多个 IP 或域名,需要在[ server_cert ]
最后一行添加上下面的内容:
subjectAltName=@alt_names [alt_names] DNS.1 = *.a.com DNS.2 = *.b.com IP.1 = 127.0.0.1 IP.2 = 10.0.1.1
5、创建证书私钥文件
在 private 目录下建立一个 intermediate_ca.key.pem 文件,这个文件是中间证书的私钥
openssl genrsa -out private/intermediate_ca.key.pem 4096
6、生成中间证书的申请文件
在中间证书目录产生中间证书的证书签发申请档,档名是 intermediate_ca.csr.pem
openssl req -config openssl_intermediate_ca.cnf -new -sha256 -key private/intermediate_ca.key.pem -out csr/intermediate_ca.csr.pem
所在的国家的缩写,2 个字母,例如 China = CH,Unit State = US
所在的州或省
所在的城市
所在的公司
所在的公司的单位
凭证的名称
联络信箱
7、使用根证书签发中间证书
使用根证书去签发中间证书的证书签发申请档,产生中间证书,证书名为 intermediate_ca.cert.pem
首先进入根证书目录
cd ../root
然后签发证书(中间证书的有效期为 3600 天)
openssl ca -config openssl_root_ca.cnf -extensions intermediate_ca -days 3600 -notext -md sha256 -in ../intermediate/csr/intermediate_ca.csr.pem -out ../intermediate/cert/intermediate_ca.cert.pem
接着询问你是否签发证书(选择 y)
以及询问是否纪录签发的证书到根证书目录的资料库中(index.txt,serial),输入 y,注意这里更新的是根证书下的相关记录文件
8、验证中间证书
openssl x509 -noout -text -in ../intermediate/cert/intermediate_ca.cert.pem
确定一下中间证书是由根证书签发的(显示“OK”代表是正确的)
openssl verify -CAfile cert/root_ca.cert.pem ../intermediate/cert/intermediate_ca.cert.pem
9、完善证书链
产生中间证书的整数串链,档名是 chain_ca.cert.pem
浏览器在验证网站传来的证书是否可信任时,需要验证从“根证书 – >中间证书-1 – > … – >中间证书-N – >终端证书”整个串链,所以网站在传送证书时是传送整个串链的证书给浏览器
因此证书中心除了签发证书给对方之外,还必须将上层证书中心给的证书串链加上自己的证书产生新的证书串链,再将新的证书串链给对方
证书串链的格式是:
—– BEGIN CERTIFICATE —–
证书 1 内容……
—– END CERTIFICATE —–
—–BEGIN CERTIFICATE—–
证书 2 内容……
—–END CERTIFICATE—–
…
—–BEGIN CERTIFICATE—–
证书 N 内容……
—– END CERTIFICATE —–
证书串链内证书的顺序是自己的证书在最前面,所以就是:
—–BEGIN CERTIFICATE—–
中间证书 -N
—–END CERTIFICATE—–
…
—–BEGIN CERTIFICATE—–
中间证书 -1
—–END CERTIFICATE—–
—–BEGIN CERTIFICATE—–
根证书
—–END CERTIFICATE—–
应用程式必须自己拥有对方的证书的根证书,表示信任此根证书所签发的证书,才有办法验证对方传来的证书串链,所以实际使用时证书串链可以不包含根证书部分
回到中继凭证目录处理
cd ../intermediate
产生证书串链(包含根证书)
cat cert/intermediate_ca.cert.pem ../root/cert/root_ca.cert.pem > chain/chain.cert.pem
服务端证书的建立
1、建立一个服务端目录,用于存放服务端证书的相关文件
在/ca 目录下建立一个目录,存放所有关于服务端证书的资料,名称是/ca/server
cd /ca mkdir server cd server
2、创建服务端设定档
填写 OpenSSL 需要的设定档,档名是 openssl_csr.cnf
touch openssl_csr.cnf
放置在服务端的目录内,通过 winscp 输入内容如下:
[ req ] #req 工具需要的参数 default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 [ req_distinguished_name ] #产生凭证时要输入的资料的说明 countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address
如果你想给你的服务端证书添加多个 IP 或域名,需要在[ server_cert ]
最后一行添加上下面的内容:
[alt_names] DNS.1 = *.a.com DNS.2 = *.b.com IP.1 = 127.0.0.1 IP.2 = 10.0.1.1
3、创建服务端私钥
在服务端目录下产生服务端证书的私钥,私钥名是 server.key.pem
openssl genrsa -out server.key.pem 4096
4、证书签发申请档
在目录产生服务端证书的证书签发申请档,档名是 server.csr.pem
openssl req -config openssl_csr.cnf -new -sha256 -key server.key.pem -out server.csr.pem
所在的国家的缩写,2 个字母,例如 China = CH,Unit State = US
所在的州或省
所在的城市
所在的公司
所在的公司的单位
凭证的名称
联络信箱
5、使用申请档生成服务端证书
使用中间证书去签发服务端证书的证书签发申请档,产生服务端的证书,证书名为 server.cert.pem
先进入中间证书的目录下
cd ../intermediate
然后使用中间证书签发服务端证书(证书的有效期为 1800 天)
openssl ca -config openssl_intermediate_ca.cnf -extensions server_cert -days 1800 -notext -md sha256 -in ../server/server.csr.pem -out ../server/server.cert.pem
并询问你是否签发服务端证书
询问你是否更新中间证书目录下的相关资料库文件(index.txt,serial),注意:由于是中间证书签发的,所以更新的是中间证书目录下的记录文件
检查签发的服务端证书是否无误
openssl x509 -noout -text -in ../server/server.cert.pem
6、确认服务端证书的完整性
需要做完整的串链检查,需要使用含有根证书的证书串链(显示“OK”代表没问题)
openssl verify -CAfile chain/chain.cert.pem ../server/server.cert.pem
7、产生服务端证书的证书串链
回到服务端证书目录
cd ../server
产生证书串链
cat server.cert.pem ../intermediate/chain/chain.cert.pem > server_chain.cert.pem
到这里,服务端证书已经签发完毕。
将server.key.pem
作为服务端密匙
server_chain.cert.pem
作为服务端证书
导入网站 ssl 即可。
客户端(PC)导入自签发证书
请注意,如果客户端(PC)没有导入自签发的根证书和中间证书,就算你给网站添加了 ssl,还是会提示证书风险问题。因此,需要你给你的电脑导入根证书和中间证书。
根证书路径:/ca/root/cert/root_ca.cert.pem
中间证书路径:/ca/intermediate/chain/chain.cert.pem
需要将这两个文件下载到本地计算机,修改后缀为crt
双击安装。根证书安装在受信任的根证书颁发机构
中间证书安装在中间证书颁发机构
。