@cdmonkey
2017-07-25T11:46:03.000000Z
字数 7334
阅读 1717
SSL
http://www.tuicool.com/articles/uaeQb2
一般的证书都是绑定域名的,服务器更换IP地址没有任何关系,只要域名不变,重新解析到新的IP地址即可,原来的SSL证书当然照样可以用。但如果您申请的SSL证书是为IP地址申请的,则服务器换了IP地址,原来的SSL证书就不能用了。所以,您要根据您的业务情况需要决定是为您的网站域名还是IP地址申请证书。Geotrust 有绑定IP的证书.但是绑定IP的证书不能绑定公网IP
主流SSL有两种可以绑定多个域名的:
http://www.douban.com/note/286656900/
http://cn.globalsign.com/ssl/ssl_wildcard_ssl.html
创办证书颁发机构首先,需要准备一个目录存放CA
文件,包括颁发的证书文件和证书撤销列表
CRL(Certificate Revoke List)
[root@Node-A2 ~]# mkdir /var/myCA
随后我们于该目录下创建两个子目录,certs
目录用来保存我们的CA
颁发的所有的证书的副本,而private
目录则用来保存CA
证书的私钥:
[root@Node-A2 ~]# mkdir /var/myCA/{certs,private}
[root@Node-A2 ~]# chmod 700 /var/myCA/private/
除了生成密钥,我们创建的CA
体系中还需要创建三个文件:
serial
,初始化为01
。index.txt
,文件内容为空。
[root@Node-A2 ~]# echo "01" >/var/myCA/serial
[root@Node-A2 ~]# touch /var/myCA/index.txt
-----------------
[root@Node-A2 ~]# vim /var/myCA/openssl.cnf
#证书签发的功能的相关选项的默认值就来自于以下的设置内容。
[ ca ] #该字段只是通过唯一的变量来指定默认的CA主配置字段的入口(即-name命令行选项的默认值)。
default_ca = myca
##### 默认的CA主配置字段 #####
[ myca ]
dir = /var/myCA #保存所有信息的文件夹,这个变量只是为了给后面的变量使用。
certificate = $dir/cacert.pem #存放CA自身根证书的文件名。
database = $dir/index.txt #保存已签发证书的文本数据库文件,初始时为空。
new_certs_dir = $dir/certs #存放新签发证书的默认目录,证书名就是该证书的系列号,后缀是.pem
private_key = $dir/private/cakey.pem #放CA自身私钥的文件名。
serial = $dir/serial #签发证书时使用的序列号文本文件,里面须包含下一个可用的十六进制数字。
default_crl_days= 7 #从当前证书撤销列表(CRL)到下次CRL发布的间隔天数。
default_days = 365 #新签发的证书默认有效期,以天为单位。
default_md = md5 #签发新证书以及CRL时默认的摘要算法,可以使用:md5、md2、mdc2、sha1
policy = myca_policy
#定义用于证书请求时DN信息匹配策略的字段,用于决定CA要求和处理证书请求时提供的DN信息的各个参数值的规则。
x509_extensions = certificate_extensions
#用来定义X.509证书扩展项的字段。如果没有提供这个字段则生成X.509v1而不是v3格式的证书。
##### 证书请求信息的匹配策略 #####
# 变量名称是DN信息对象的名称,变量值可以是:
# match: 该变量于证书请求中的值必须与CA证书相应的变量值完全相同,否则拒签。
# supplied: 该变量于证书请求中必须提供(值可以不同),否则拒签。
# optional: 该变量于证书请求中有没有皆可(相当于没有要求)。
[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName= supplied
organizationalUnitName = optional
[ certificate_extensions ]
basicConstraints= CA:false
#提示:系统指令openssl的默认配置文件的位置,每条配置项的解释可以参见该文件。
/etc/pki/tls/openssl.cnf
http://www.jinbuguo.com/linux/openssl_install.html
我们需要告诉“OpenSSL”设置文件的路径,有两种方法能够达成该目的:
config
指令选项。
[root@Node-A2 ~]# vim .bash_profile
# Add the following content:
OPENSSL_CONF="/var/myCA/openssl.cnf"
export OPENSSL_CONF
-----------------
[root@Node-A2 ~]# source .bash_profile
我们需要一个证书来为自己颁发的证书签名,这个证书可从其他证书颁发机构获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。首先,我们需要向设置文件里面添加一些信息。我们把所有必要的信息都写进该文件中,而不是从命令行中输入,这也是唯一指定X.509v3
扩展的方式,也能让我们对如何创建根证书有个清晰的了解。
[root@Node-A2 ~]# vim /var/myCA/openssl.cnf
# Add the following content:
##### 证书请求配置的基本字段,其它附属字段都以它为入口 #####
[ req ]
default_bits = 2048 #生成的证书中RSA密钥对的默认长度,取值是2的整数次方。
default_keyfile = /var/myCA/private/privkey.pem #保存生成的私钥文件的默认文件名。
default_md = md5
prompt = yes #若设定为no,那么req指令将直接从配置文件中读取证书字段的信息,而不提示用户输入。
distinguished_name = root_ca_distinguished_name
#定义输入用户信息选项的“特征名称”字段名,该扩展字段定义了多项用户信息。
x509_extensions = root_ca_extensions
#生成自签名证书时要使用的证书扩展项字段名,该扩展字段定义了要加入到证书中的一系列扩展项。
##### 特征名称字段包含了用户的标识信息 #####
[ root_ca_distinguished_name ]
commonName = Common Name
stateOrProvinceName = State or Province Name
countryName = Country Name
emailAddress = Email Address
organizationName = Organization Name
[ root_ca_extensions ]
basicConstraints = CA:true
操作至此我们就可以创建根证书了:
[root@Node-A2 ~]# openssl req -new -x509 -keyout cakey.pem -out cacert.pem
Generating a 2048 bit RSA private key
.....+++
........................................................................+++
writing new private key to 'cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
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.
-----
Common Name []:My Test CA
State or Province Name []:Beijing
Country Name []:CN
Email Address []:admin@myca.com
Organization Name []:Root CA
-----------------
[root@Node-A2 ~]# mv cacert.pem /var/myCA/
[root@Node-A2 ~]# mv cakey.pem /var/myCA/private/
至此,我们的测试场景中有了证书颁发机构以及颁发机构自身的密钥及证书,接下来就可以为服务器签名并颁发有效的数字证书了。
首先要创建服务端的密钥。
[root@Node-A2 ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
-----------------
[root@Node-A2 ~]# openssl genrsa -des3 -out tomcat_key.pem
Generating RSA private key, 1024 bit long modulus
.....................++++++
.....++++++
e is 65537 (0x10001)
Enter pass phrase for tomcat_key.pem:
Verifying - Enter pass phrase for tomcat_key.pem:
#运行上面的指令时会提示输入密码,此密码用于加密密钥文件(参数des3便是指加密算法,当然也可以选用其他你认为安全的算法)。以后每当需读取此文件(通过openssl提供的命令或API)都需输入口令。
#如果觉得不方便,也可以去除这个口令,但一定要采取其他的保护措施。
-----------------
# With out password protected:
openssl genrsa -out server.key 2048
#移除密钥文件口令的指令:
[root@Node-A2 ~]# openssl rsa -in tomcat_key.pem -out tomcat_key.pem
通过使用上面的指令会生成一对2048
位的密钥(当然也能够生成1024
位的)。
https://wolfpaulus.com/journal/mac/tomcat-ssl/
创建密钥对之后,接下来就是创建证书申请文件。当然,用到了前面生成的密钥文件。你可以拿着该证书申请文件去数字证书颁发机构(CA)申请一个数字证书。颁发机构会给你一个新的文件,那才是你的数字证书。
[root@Node-A2 ~]# openssl req -new -key tomcat_key.pem -out tomcat.csr
Enter pass phrase for tomcat_key.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.
-----
Common Name []:kang.com
State or Province Name []:Beijing
Country Name []:CN
Email Address []:brucemx@qq.com
Organization Name []:TEST
##### 以下是原本的证书申请文件的创建交互内容(供参考) #####
Enter pass phrase for key.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) [GB]:CN #此处输入国家代号,输入CN则表示中国。
State or Province Name (full name) [Berkshire]:China #此处输入省份的拼音名字(暂且先输入国家名吧)。
Locality Name (eg, city) [Newbury]:Beijing #此处输入所在城市的拼音名字。
Organization Name (eg, company) [My Company Ltd]:vbill.cn #此处输入公司的名称。
Organizational Unit Name (eg, section) []:network #此处可以不输入任何内容。
Common Name (eg, your name or your server's hostname') []:www.vbill.cn #此处可以不输入任何内容。
Email Address []:wang_hz@suixingpay.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: #此处可以直接回车,不输入任何内容。
An optional company name []:
通过上面的指令能够创建证书申请文件,交由证书颁发机构用于生成服务端自己的证书。
注意:证书申请文件
CSR
文件必须有CA
的签名才可形成证书。
可将证书申请文件发送到“erisign”等受信任的机构由它们进行签名颁发,要交一大笔钱,如果是进行测试,可以自己充当证书颁发机构(前文中我们已经创建了证书颁发机构),为自己颁发自签名的证书。
#如果是自己做测试,则证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
[root@Node-A2 ~]# openssl ca -in tomcat.csr -out tomcat.crt
Using configuration from /var/myCA/openssl.cnf
Enter pass phrase for /var/myCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
The Subject's 'Distinguished Name is as follows
commonName :PRINTABLE:'kang.com'
stateOrProvinceName :PRINTABLE:'Beijing'
countryName :PRINTABLE:'CN'
emailAddress :IA5STRING:'brucemx@qq.com'
organizationName :PRINTABLE:'TEST'
Certificate is to be certified until Dec 22 07:59:49 2016 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
-----------------
#因为配置文件中指定了CA的密钥文件和证书文件,所以在命令行中无需再进行指定,如果需要指定,指令如下所示:
[root@Node-A2 ~]# openssl ca -in tomcat.csr -out tomcat.crt -cert cacert.pem -keyfile cakey.pem
至此我们通过证书颁发机构(目前场景中颁证书发机构及使用证书的服务器是同一台主机)获得了证书。