安装openssl,centos都默认有安装。
没有的话,yum -y install openssl
1. 颁发证书
1.1 修改CA的一些配置文件
CA要给别人颁发证书,首先自己得有一个作为根证书,我们得在一切工作之前修改好CA的配置文件、序列号、索引等等。
vi /etc/pki/tls/openssl.cnf:
...
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem # The private key
RANDFILE = $dir/private/.rand # private random number file
...
default_days = 3650 # how long to certify for
...
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
...
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = GD
...
[ req_distinguished_name ] 部分主要是颁证时一些默认的值,可以不动
一定要注意[ policy_match ]中的设定的匹配规则,是有可能因为证书使用的工具不一样,导致即使设置了csr中看起来有相同的countryName,stateOrProvinceName等,但在最终生成证书时依然报错:
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
The stateOrProvinceName field needed to be the same in the
CA certificate (GuangDong) and the request (GuangDong)
touch index.txt serial:
在CA目录下创建两个初始文件:
# touch index.txt serial
# echo 01 > serial
1.2 生成根密钥
# cd /etc/pki/CA/
# openssl genrsa -des3 -out private/cakey.pem 2048
为了安全起见,修改cakey.pem私钥文件权限为600或400,也可以使用子shell生成( umask 077; openssl genrsa -out private/cakey.pem 2048 ),下面不再重复。
1.3 生成根证书
使用req命令生成自签证书:
# openssl req -new -x509 -days 3650 -key private/cakey.pem -out cacert.pem -utf8 ------加上-utf8支持中文
会提示输入一些内容,因为是私有的,所以可以随便输入(之前修改的openssl.cnf会在这里呈现),最好记住能与后面保持一致。上面的自签证书cacert.pem应该生成在/etc/pki/CA下。
1.4 为我们的nginx web服务器生成ssl密钥(apache类似)
以上都是在CA服务器上做的操作,而且只需进行一次,现在转到nginx服务器上执行:
# cd /etc/nginx/ssl
# openssl genrsa -out nginx.key 2048
这里测试的时候CA中心与要申请证书的服务器是同一个。
1.5 为nginx生成证书签署请求
# openssl req -new -key nginx.key -out nginx.csr
...
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GD
Locality Name (eg, city) []:SZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:COMPANY
Organizational Unit Name (eg, section) []:IT_SECTION
Common Name (e.g. server FQDN or YOUR name) []:your.domain.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...
同样会提示输入一些内容,其它随便,除了Commone Name一定要是你要授予证书的服务器域名或主机名,challenge password不填。
1.6 私有CA根据请求来签署证书
接下来要把上一步生成的证书请求csr文件,发到CA服务器上,在CA上执行:
# openssl ca -days 730 -in nginx.csr -out nginx.crt -----days 730 表示证书有效期2年。
另外在极少数情况下,上面的命令生成的证书不能识别,试试下面的命令:
# openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out server.crt
上面签发过程其实默认使用了-cert cacert.pem -keyfile cakey.pem,这两个文件就是前两步生成的位于/etc/pki/CA下的根密钥和根证书。将生成的crt证书发回nginx服务器使用。
到此我们已经拥有了建立ssl安全连接所需要的所有文件,并且服务器的crt和key都位于配置的目录下,剩下的是如何使用证书的问题。
双向认证:在httpd-ssl.conf配置文件中:
找到
#SSLVerifyClient require
#SSLVerifyDepth 10
修改为:
SSLVerifyClient require
SSLVerifyDepth 1
浏览器导入个人证书client.pfx。并测试访问。
1.7生成client证书。
创建客户端证书密钥文件client.key:
openssl genrsa -out client.key 2048
创建客户端证书的申请文件client.csr:
openssl req -new -key client.key -out client.csr
创建一个自当前日期起有效期为两年的客户端证书client.crt:
[size=13.63636302948px]openssl ca -days 730 -in client.csr -out client.crt
将客户端证书文件client.crt和客户端证书密钥文件client.key合并成客户端证书安装包client.pfx:
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
取消www.your.com.key的私钥保护密码:
openssl rsa -in ca.key -out ca.key
** 输入lny.your.com的私钥保护密码。
1.8 保存生成的文件备用,其中server.crt和server.key是配置单向SSL时需要使用的证书文件,client.crt是配置双向SSL时需要使用的证书文件,client.pfx是配置双向SSL时需要客户端安装的证书文件
常见error:
Certificate is to be certified until Mar 14 07:26:09 2018 GMT (730 days)
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
解决方法:rm -rf /etc/pki/CA/index.txt 重新建立一个index.txt
参考文献:
https://segmentfault.com/a/1190000002569859
http://blog.csdn.net/fyang2007/article/details/6180361
http://www.linuxidc.com/Linux/2015-05/117479.htm
openssl命令大全:http://wenku.baidu.com/link?url=Ufqva6fg-pOfUAQXqGEuGHjE6Nx8tJq8MLqyJ6vWu2Kg1t0s26lyAyGT5SzBgmkUBW097Pkew1YEjh3xsGneQypo5p5PkgGcHDXZa94bRe_
openssl命令详解:http://blog.csdn.net/as3luyuan123/article/details/16105475
apache ssl官方中文文档;http://apache.chinahtml.com/ssl/ssl_howto.html#allclients
没有的话,yum -y install openssl
1. 颁发证书
1.1 修改CA的一些配置文件
CA要给别人颁发证书,首先自己得有一个作为根证书,我们得在一切工作之前修改好CA的配置文件、序列号、索引等等。
vi /etc/pki/tls/openssl.cnf:
...
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept
certs = $dir/certs # Where the issued certs are kept
crl_dir = $dir/crl # Where the issued crl are kept
database = $dir/index.txt # database index file.
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
certificate = $dir/cacert.pem # The CA certificate
serial = $dir/serial # The current serial number
crlnumber = $dir/crlnumber # the current crl number
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/cakey.pem # The private key
RANDFILE = $dir/private/.rand # private random number file
...
default_days = 3650 # how long to certify for
...
# For the CA policy
[ policy_match ]
countryName = match
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
...
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = GD
...
[ req_distinguished_name ] 部分主要是颁证时一些默认的值,可以不动
一定要注意[ policy_match ]中的设定的匹配规则,是有可能因为证书使用的工具不一样,导致即使设置了csr中看起来有相同的countryName,stateOrProvinceName等,但在最终生成证书时依然报错:
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
The stateOrProvinceName field needed to be the same in the
CA certificate (GuangDong) and the request (GuangDong)
touch index.txt serial:
在CA目录下创建两个初始文件:
# touch index.txt serial
# echo 01 > serial
1.2 生成根密钥
# cd /etc/pki/CA/
# openssl genrsa -des3 -out private/cakey.pem 2048
为了安全起见,修改cakey.pem私钥文件权限为600或400,也可以使用子shell生成( umask 077; openssl genrsa -out private/cakey.pem 2048 ),下面不再重复。
1.3 生成根证书
使用req命令生成自签证书:
# openssl req -new -x509 -days 3650 -key private/cakey.pem -out cacert.pem -utf8 ------加上-utf8支持中文
会提示输入一些内容,因为是私有的,所以可以随便输入(之前修改的openssl.cnf会在这里呈现),最好记住能与后面保持一致。上面的自签证书cacert.pem应该生成在/etc/pki/CA下。
1.4 为我们的nginx web服务器生成ssl密钥(apache类似)
以上都是在CA服务器上做的操作,而且只需进行一次,现在转到nginx服务器上执行:
# cd /etc/nginx/ssl
# openssl genrsa -out nginx.key 2048
这里测试的时候CA中心与要申请证书的服务器是同一个。
1.5 为nginx生成证书签署请求
# openssl req -new -key nginx.key -out nginx.csr
...
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GD
Locality Name (eg, city) []:SZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:COMPANY
Organizational Unit Name (eg, section) []:IT_SECTION
Common Name (e.g. server FQDN or YOUR name) []:your.domain.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
...
同样会提示输入一些内容,其它随便,除了Commone Name一定要是你要授予证书的服务器域名或主机名,challenge password不填。
1.6 私有CA根据请求来签署证书
接下来要把上一步生成的证书请求csr文件,发到CA服务器上,在CA上执行:
# openssl ca -days 730 -in nginx.csr -out nginx.crt -----days 730 表示证书有效期2年。
另外在极少数情况下,上面的命令生成的证书不能识别,试试下面的命令:
# openssl x509 -req -in server.csr -CA /etc/pki/CA/cacert.pem -CAkey /etc/pki/CA/private/cakey.pem -CAcreateserial -out server.crt
上面签发过程其实默认使用了-cert cacert.pem -keyfile cakey.pem,这两个文件就是前两步生成的位于/etc/pki/CA下的根密钥和根证书。将生成的crt证书发回nginx服务器使用。
到此我们已经拥有了建立ssl安全连接所需要的所有文件,并且服务器的crt和key都位于配置的目录下,剩下的是如何使用证书的问题。
双向认证:在httpd-ssl.conf配置文件中:
找到
#SSLVerifyClient require
#SSLVerifyDepth 10
修改为:
SSLVerifyClient require
SSLVerifyDepth 1
浏览器导入个人证书client.pfx。并测试访问。
1.7生成client证书。
创建客户端证书密钥文件client.key:
openssl genrsa -out client.key 2048
创建客户端证书的申请文件client.csr:
openssl req -new -key client.key -out client.csr
创建一个自当前日期起有效期为两年的客户端证书client.crt:
[size=13.63636302948px]openssl ca -days 730 -in client.csr -out client.crt
将客户端证书文件client.crt和客户端证书密钥文件client.key合并成客户端证书安装包client.pfx:
openssl pkcs12 -export -in client.crt -inkey client.key -out client.pfx
取消www.your.com.key的私钥保护密码:
openssl rsa -in ca.key -out ca.key
** 输入lny.your.com的私钥保护密码。
1.8 保存生成的文件备用,其中server.crt和server.key是配置单向SSL时需要使用的证书文件,client.crt是配置双向SSL时需要使用的证书文件,client.pfx是配置双向SSL时需要客户端安装的证书文件
常见error:
Certificate is to be certified until Mar 14 07:26:09 2018 GMT (730 days)
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
解决方法:rm -rf /etc/pki/CA/index.txt 重新建立一个index.txt
参考文献:
https://segmentfault.com/a/1190000002569859
http://blog.csdn.net/fyang2007/article/details/6180361
http://www.linuxidc.com/Linux/2015-05/117479.htm
openssl命令大全:http://wenku.baidu.com/link?url=Ufqva6fg-pOfUAQXqGEuGHjE6Nx8tJq8MLqyJ6vWu2Kg1t0s26lyAyGT5SzBgmkUBW097Pkew1YEjh3xsGneQypo5p5PkgGcHDXZa94bRe_
openssl命令详解:http://blog.csdn.net/as3luyuan123/article/details/16105475
apache ssl官方中文文档;http://apache.chinahtml.com/ssl/ssl_howto.html#allclients
0
本帖最后由 casparcc 于 2016-3-24 15:39 编辑
吊销证书:
1种方法、吊销证书命令:openssl ca -revoke xxx.pem
生成吊销证书列表:openssl ca -gencrl -out xxx.crl
1)apache 中的使用
设置/usr/local/etc/apache2/Include/http-ssl.conf
SSLCARevocationFile "/usr/local/apache/conf/ssl/root.crl"
这样当持有作废的客户端证书访问的时候,会跳出如下提示
2种方法、吊销证书:
vim /etc/pki/CA/index.txt //查看对应证书的主题,序列号。
创建证书时,openssl自动将新创建的证书存储在/etc/pki/CA/newcerts目录下,文件名为<证书序号>.pem
openssl x509 -in /etc/pki/CA/newcerts/05.pem -text //查看主题,确认证书。
然后,使用下列命令注销此证书:
openssl ca -revoke /etc/pki/CA/newcerts/05.pem
生成证书注销列表文件;
openssl ca -gencrl -crldays 7 -crlexts crl_ext -out /etc/pki/CA/crl/your.crl -config /etc/pki/tls/openssl.cnf
转换PEM格式证书列表文件为DER格式;
本步骤是可选的。如果客户端或服务器需要DER格式的证书注销列表文件,则可以使用下列命令进行格式转换:
openssl crl -inform PEM -outform DER -in /etc/pki/CA/crl/your.crl -out /etc/pki/CA/crl/your_bin.crl
注意:上述操作中,我们可以注销多个证书后再生成证书注销列表。生成证书注销列表时,我们指定了下次发布证书注销列表的日期为7日后(-crldays 7)。
若吊销列表不可用,重新生成一个吊销列表就好了,配置后再次访问就会提示证书已被吊销。
参考文献:http://www.mamicode.com/info-detail-1082882.html
http://www.blogjava.net/sham2k/articles/163985.html
吊销证书:
1种方法、吊销证书命令:openssl ca -revoke xxx.pem
生成吊销证书列表:openssl ca -gencrl -out xxx.crl
1)apache 中的使用
设置/usr/local/etc/apache2/Include/http-ssl.conf
SSLCARevocationFile "/usr/local/apache/conf/ssl/root.crl"
这样当持有作废的客户端证书访问的时候,会跳出如下提示
2种方法、吊销证书:
vim /etc/pki/CA/index.txt //查看对应证书的主题,序列号。
创建证书时,openssl自动将新创建的证书存储在/etc/pki/CA/newcerts目录下,文件名为<证书序号>.pem
openssl x509 -in /etc/pki/CA/newcerts/05.pem -text //查看主题,确认证书。
然后,使用下列命令注销此证书:
openssl ca -revoke /etc/pki/CA/newcerts/05.pem
生成证书注销列表文件;
openssl ca -gencrl -crldays 7 -crlexts crl_ext -out /etc/pki/CA/crl/your.crl -config /etc/pki/tls/openssl.cnf
转换PEM格式证书列表文件为DER格式;
本步骤是可选的。如果客户端或服务器需要DER格式的证书注销列表文件,则可以使用下列命令进行格式转换:
openssl crl -inform PEM -outform DER -in /etc/pki/CA/crl/your.crl -out /etc/pki/CA/crl/your_bin.crl
注意:上述操作中,我们可以注销多个证书后再生成证书注销列表。生成证书注销列表时,我们指定了下次发布证书注销列表的日期为7日后(-crldays 7)。
若吊销列表不可用,重新生成一个吊销列表就好了,配置后再次访问就会提示证书已被吊销。
参考文献:http://www.mamicode.com/info-detail-1082882.html
http://www.blogjava.net/sham2k/articles/163985.html
编辑回复