openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml
自建CA的机制:1.生成私钥;2.建立证书请求;3.使用私钥对证书请求签名。vim
因为测试环境,因此自建的CA只能是根CA。所使用的配置文件以下。dom
[default] name = root-ca /* 变量*/ default_ca = CA_default name_opt = ca_default cert_opt = ca_default [CA_default] home = . /* 变量*/ database = $home/db/index serial = $home/db/serial crlnumber = $home/db/crlnumber certificate = $home/$name.crt private_key = $home/private/$name.key RANDFILE = $home/private/random new_certs_dir = $home/certs unique_subject = no copy_extensions = none default_days = 3650 default_crl_days = 365 default_md = sha256 policy = policy_to_match [policy_to_match] countryName = match stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [CA_DN] countryName = "C" contryName_default = "CN" organizationName = "O" organizationName_default = "jmu" commonName = "CN" commonName_default = "longshuai.com" [req] default_bits = 4096 encrypt_key = no default_md = sha256 utf8 = yes string_mask = utf8only # prompt = no /* 测试时该选项致使出错,因此将其注释掉*/ distinguished_name = CA_DN req_extensions = ca_ext [ca_ext] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash
[root@xuexi ~]# mkdir /ssl;touch /ssl/ssl.conf [root@xuexi ~]# cd /ssl [root@xuexi ssl]# vim ssl.conf
[root@xuexi ssl]# mkdir /ssl/{db,private,certs} [root@xuexi ssl]# chmod -R 400 private/
普通的证书请求须要使用CA的私钥进行签名变成证书,既然是自签名证书那固然是使用本身的私钥来签名。能够使用伪命令req、ca、x509来自签名。测试
这里有两种方法:1.一步完成,即私钥、证书请求、自签名都在一个命令中完成2.分步完成,先生成私钥、再建立证书请求、再指定私钥来签名。方法2中其实生成私钥和证书申请能够合并在一步中完成,证书申请和签名也能够合并在一步中完成。ui
方法一:一步完成加密
在下面的一步命令中,使用-new因为没有指定私钥输出位置,因此自动保存在ssl.conf中default_keyfile指定的private.pem中;因为ssl.conf中的req段设置了encrypt_key=no,因此交互时不须要输入私钥的加密密码;因为使用req -x509自签名的证书有效期默认为30天,而配置文件中req段又不能配置该期限,因此只能使用-days来指定有效期限,注意这个-days选项只做用于x509签名,证书请求中若是指定了时间是无效的。spa
[root@xuexi ssl]# openssl req -x509 -new -out req.crt -config ssl.conf -days 365 [root@xuexi ssl]# ll total 24 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem /* 注意权限为644 */ -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf [root@xuexi ssl]# openssl x509 -noout -dates -in req.crt notBefore=Nov 22 02:52:24 2016 GMT notAfter=Nov 22 02:52:24 2017 GMT
方法二:分步完成,这里把各类可能的步骤合并都演示一遍code
>>建立私钥和证书请求合并而签名独自进行的方法<<htm
[root@xuexi ssl]# openssl req -newkey rsa:1024 -keyout key.pem -out req1.csr -config ssl.conf -days 365 [root@xuexi ssl]# openssl req -x509 -in req1.csr -key key.pem -out req1.crt [root@xuexi ssl]# openssl x509 -noout -dates -in req1.crt/* 注意签名不要配置文件 */ notBefore=Nov 22 02:58:25 2016 GMT notAfter=Dec 22 02:58:25 2016 GMT /* 能够看到证书请求中指定-days是无效的 */ [root@xuexi ssl]# ll total 36 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw-r--r-- 1 root root 912 Nov 22 10:57 key.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem -rw-r--r-- 1 root root 826 Nov 22 10:58 req1.crt -rw-r--r-- 1 root root 688 Nov 22 10:57 req1.csr -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
>>独自生成私钥,而请求和签名合并的方法<<blog
[root@xuexi ssl]# (umask 077;openssl genrsa -out key1.pem 1024) [root@xuexi ssl]# openssl req -x509 -new -key key1.pem -out req2.crt -config ssl.conf -days 365 [root@xuexi ssl]# openssl x509 -noout -dates -in req2.crt notBefore=Nov 22 03:28:31 2016 GMT notAfter=Nov 22 03:28:31 2017 GMT [root@xuexi ssl]# ll total 44 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw-r--r-- 1 root root 912 Nov 22 10:57 key1.pem -rw------- 1 root root 887 Nov 22 11:26 key2.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem -rw-r--r-- 1 root root 826 Nov 22 10:58 req1.crt -rw-r--r-- 1 root root 688 Nov 22 10:57 req1.csr -rw-r--r-- 1 root root 709 Nov 22 11:28 req2.crt -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
>>彻底分步进行<<
[root@xuexi ssl]# rm -rf key* req* private.pem [root@xuexi ssl]# (umask 077;openssl genrsa -out key.pem 1024) [root@xuexi ssl]# openssl req -new -key key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl req -x509 -key key.pem -in req.csr -out req.crt -days 365 [root@xuexi ssl]# openssl x509 -noout -dates -in req.crt notBefore=Nov 22 04:29:21 2016 GMT notAfter=Nov 22 04:29:21 2017 GMT [root@xuexi ssl]# ll total 28 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw------- 1 root root 887 Nov 22 12:28 key.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 826 Nov 22 12:29 req.crt -rw-r--r-- 1 root root 688 Nov 22 12:28 req.csr -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
在本节的开头说明了建立证书请求时须要提供私钥,这个私钥的做用是为了提供公钥。下面是验证。
/* 提取私钥key.pem中的公钥到key.pub文件中 */ [root@xuexi ssl]# openssl rsa -in key.pem -pubout -out key.pub /* 输出证书请求req.csr中的公钥部分 */ [root@xuexi ssl]# openssl req -noout -pubkey -in req.csr -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5 D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/ aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL hU7nx+Du637UDlwdEQIDAQAB -----END PUBLIC KEY----- /* 查看key.pub,能够发现和req.csr中的公钥是同样的 */ [root@xuexi ssl]# cat key.pub -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5 D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/ aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL hU7nx+Du637UDlwdEQIDAQAB -----END PUBLIC KEY-----
虽然建立证书请求时使用的是公钥,可是却不能使用-key选项指定公钥,而是只能指定私钥,由于req -new或-newkey选项会调用openssl rsa命令来提取公钥,指定公钥该调用将执行失败。
使用x509伪命令须要提供请求文件,所以须要先建立证书请求文件。因为x509伪命令签名时不读取配置文件,因此不须要设置配置文件,若须要某选项,只需使用x509中对应的选项来达成便可。
如下x509 -req用于自签名,须要-signkey提供签名所需私钥key.pem。
[root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl x509 -req -in req.csr -signkey key.pem -out x509.crt
使用ca伪命令自签名会读取配置文件中的ca部分,因此配置文件中所需的目录和文件结构都须要建立好,包括目录db、private、certs,文件db/index、db/serial,并向serial中写入一个序列号。因为是自签名,能够自行指定私钥文件,所以对于签名所需CA私钥文件无需放置在private目录中。
[root@xuexi ssl]# touch db/{serial,index} [root@xuexi ssl]# echo "01" > db/serial [root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf
在此签名过程当中有两次询问,以下:
Certificate is to be certified until Nov 20 06:34:41 2026 GMT (3650 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
若要无交互,则使用-batch进入批处理模式。
[root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf -batch
CA为其余请求或证书签名时,须要使用到的文件有:本身的CA证书和本身的私钥文件。所以签名过程当中须要提供这两个文件。
使用ca伪命令自建根CA后,目录结构以下:
[root@xuexi ssl]# tree -R -C . ├── certs │ └── 01.pem ├── db │ ├── index │ ├── index.attr │ ├── index.old │ ├── serial │ └── serial.old ├── key.pem ├── private ├── req.csr └── ssl.conf
其中01.pem是根CA证书,key.pem是根CA私钥。
如今要为其余证书请求签名,首先建立其余请求吧,假设该请求文件/tmp/req.csr。
[root@xuexi ssl]# openssl req -new -keyout /tmp/key.pem -out /tmp/req.csr -config ssl.conf
使用根证书01.pem为/tmp/req.csr签名。
[root@xuexi ssl]# openssl ca -in /tmp/req.csr -keyfile key.pem -cert certs/01.pem -config ssl.conf -batch
这样挺麻烦,由于每次为别人签名时都要指定-cert和-keyfile,能够将CA的证书和CA的私钥移动到配置文件中指定的路径下:
certificate = $home/$name.crt private_key = $home/private/$name.key |
[root@xuexi ssl]# mv certs/01.pem root-ca.crt [root@xuexi ssl]# mv key.pem private/root-ca.key
再使用ca签名时将能够使用默认值。
[root@xuexi ssl]# openssl ca -in /tmp/req.csr -config ssl.conf -batch
如今根CA证书为root-ca.crt,CA的私钥为private/root-ca.key。
下面使用x509伪命令实现签名。因为x509不会读取配置文件,因此须要提供签名的序列号,使用-CAcreateserial能够在没有序列号文件时自动建立;因为x509默认-in指定的输入文件是证书文件,因此要对请求文件签名,须要使用-req来表示输入文件为请求文件。
[root@xuexi ssl]# openssl x509 -req -in /tmp/req.csr -CA root-ca.crt -CAkey private/root-ca.key -out x509.crt -CAcreateserial
这是推荐采用的方法,由于方便管理,但使用默认配置文件,须要进行一些初始化动做。
因为彻底采用/etc/pki/tls/openssl.cnf的配置,因此要创建相关文件。
自建CA的过程:
[root@xuexi tmp]# touch /etc/pki/CA/index.txt [root@xuexi tmp]# echo "01" > /etc/pki/CA/serial [root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem # 建立CA的私钥 [root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr # 建立CA待自签署的证书请求文件 [root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr # 自签署 [root@xuexi tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem # 将自签署的证书按照配置文件的配置复制到指定位置
为他人颁发证书的过程:
[root@xuexi tmp]# openssl ca -in youwant1.csr
签署成功后,证书位于/etc/pki/CA/newcert目录下,将新生成的证书文件发送给申请者便可。