ssl自签证书生成,实现https

回复 收藏
安装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

2016-03-24 15:17 举报
已邀请:
0

casparcc

赞同来自:

本帖最后由 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"

这样当持有作废的客户端证书访问的时候,会跳出如下提示

4.png


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
0

qq495966654

赞同来自:

10期的 顶起
0

casparcc

赞同来自:


{:7_184:}{:7_184:}
0

daydayup

赞同来自:

葫芦娃  我来给你捧场{:4_95:}
0

casparcc

赞同来自:

daydayup 发表于 2016-3-24 20:58
葫芦娃  我来给你捧场

哈哈  多谢
0

jinm

赞同来自:

真详细!{:7_234:}
0

has

赞同来自:

谢谢分享

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: