openssl ca(签署和自建CA)
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
用于签署证书请求、生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库。因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能。
证书请求文件使用CA的私钥签署之后就是证书,签署之后将证书发给申请者就是颁发证书。在签署时,为了保证证书的完整性和一致性,还应该对签署的证书生成数字摘要,即使用单向加密算法。
由于openssl ca命令对配置文件(默认为/etc/pki/tls/openssl.cnf)的依赖性非常强,所以建议结合我的另一篇文章配置文件openssl.cnf来阅读,如果不明白配置文件,下面的内容很可能不知所云。
在配置文件中指定了签署证书时所需文件的结构,默认openssl.cnf中的结构要求如下:
[ CA_default ]
dir = /etc/pki/CA # 定义路径变量
certs = $dir/certs # 已颁发证书的保存目录
database = $dir/index.txt # 数据库索引文件
new_certs_dir = $dir/newcerts # 新签署的证书保存目录
certificate = $dir/cacert.pem # CA证书路径名
serial = $dir/serial # 当前证书序列号
private_key = $dir/private/cakey.pem # CA的私钥路径名
其中目录/etc/pki/CA/{certs,newcerts,private}在安装openssl后就默认存在,所以无需独立创建,但证书的database文件index.txt和序列文件serial必须创建好,且序列号文件中得先给定一个序号,如"01"。
[root@xuexi tmp]# touch /etc/pki/CA/index.txt [root@xuexi tmp]# echo "" > /etc/pki/CA/serial
另外,要签署证书请求,需要CA自己的私钥文件以及CA自己的证书,先创建好CA的私钥,存放位置为配置文件中private_key所指定的值,默认为/etc/pki/CA/private/cakey.pem。
[root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem
(1).使用openssl ca自建CA
要提供CA自己的证书,测试环境下CA只能自签署,使用"openssl req -x509"、"openssl x509"和"openssl ca"都可以自签署证书请求文件,此处仅介绍openssl ca命令自身自签署的方法。
先创建CA的证书请求文件,建议使用CA的私钥文件/etc/pki/CA/private/cakey.pem来创建待自签署的证书请求文件,虽非必须,但方便管理。创建请求文件时,其中Country Name、State or Province Name、Organization Name和Common Name默认是必须提供的。
[root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr
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) [XX]:CN
State or Province Name (full name) []:FJ
Locality Name (eg, city) [Default City]:XM
Organization Name (eg, company) [Default Company Ltd]:JM
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:www.iwant.com
Email Address []:. Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.
然后使用openssl ca命令自签署该证书请求文件。如果有两次交互式询问则表示自签署将成功,如果失败,则考虑数据库文件index.txt是否创建、序列号文件serial是否存在且有序号值、私钥文件cakey.pem是否路径正确、创建证书请求文件时是否该提供的没有提供等情况。
[root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr
Using configuration from /etc/pki/tls/openssl.cnf # 默认采用/etc/pki/tls/openssl.cnf作为配置文件
Check that the request matches the signature # 验证证书请求文件的数字签名,确保该证书请求文件是完整未修改过的
Signature ok
Certificate Details: # 待生成证书的信息
Serial Number: (0x1) # 序列号为1
Validity
Not Before: Jun :: GMT # 证书有效期起始日为2017-- ::
Not After : Jun :: GMT # 证书有效期终止日为2018-- ::
Subject: # Subject信息,subject是非常重要的信息
countryName = CN
stateOrProvinceName = FJ
organizationName = JM
organizationalUnitName = IT
commonName = www.iwant.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
A5:0D:DD:D6::C6::::F4:::F6:A9::3E::D2:8A:
X509v3 Authority Key Identifier:
keyid:A5:0D:DD:D6::C6::::F4:::F6:A9::3E::D2:8A: Certificate is to be certified until Jun :: GMT ( days)
Sign the certificate? [y/n]:y out of certificate requests certified, commit? [y/n]y
Write out database with new entries # 向数据库文件添加一条该证书的记录
Certificate: # 该证书的信息
Data:
Version: (0x2)
Serial Number: (0x1)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=CN, ST=FJ, O=JM, OU=IT, CN=www.iwant.com
Validity
Not Before: Jun :: GMT
Not After : Jun :: GMT
Subject: C=CN, ST=FJ, O=JM, OU=IT, CN=www.iwant.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: ( bit)
Modulus:
::::f4::a4:fc:a4:6b:::4c:be:4f:
d1:3f::bd:::c8::f9:eb:::ac::6b:
ae:bb::bf:f2:a3:0c:e3:d3::::1e:d9:e1:
8a:::c6:e0::6d:3a:cb:2f:9c::ab:4c::
7a:4a::e1:6e:a0:6a::::1c:a2:5f:::
:e0:cd:::e9::::c2::7c:::ee:
:8e:b1::7d:::::::c1:8c:::
:f9:5d:::::3b:::9b:::::
::::3f:6a:d9:a6:
Exponent: (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
A5:0D:DD:D6::C6::::F4:::F6:A9::3E::D2:8A:
X509v3 Authority Key Identifier:
keyid:A5:0D:DD:D6::C6::::F4:::F6:A9::3E::D2:8A: Signature Algorithm: sha1WithRSAEncryption
1e:4e:f4:e4:c9:::::ae:b4:2a:::::9b::
b3:e9::1c:b2:f2:::d8::::9a:4f::4d:c9:ce:
0c::::4f::8a:4c:f7:b8:bf::b2::8a:2e:::
::de::::d2::::8f:8b:4b::c0:::ef:
:5b::d4:cf:c9:b8:e1:::6e:b4:5b::4a:::a1:
ad:5c:b7:d8:da::9a:::b9:8e:eb:1a:9c:2e:6c::d3:
c5:db:9c:::::bf:ad:bc::4c:d1:6b:6b:a7:::
1a:6b
-----BEGIN CERTIFICATE-----
MIICiTCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQUFADBMMQswCQYDVQQGEwJDTjEL
MAkGA1UECAwCRkoxCzAJBgNVBAoMAkpNMQswCQYDVQQLDAJJVDEWMBQGA1UEAwwN
d3d3Lml3YW50LmNvbTAeFw0xNzA2MjcxMDA2MjlaFw0xODA2MjcxMDA2MjlaMEwx
CzAJBgNVBAYTAkNOMQswCQYDVQQIDAJGSjELMAkGA1UECgwCSk0xCzAJBgNVBAsM
AklUMRYwFAYDVQQDDA13d3cuaXdhbnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQCUSTP0kKT8pGtldUy+T9E/lb0kYMhF+esAMaxFa667Y7/yowzj01Ag
Mx7Z4YpJQsbgZ206yy+ckKtMEHpKguFuoGpjhFYcol8RYJngzSBo6ZhAaMJDfJcS
7jGOsXN9NpmXSTFQwYxHEBb5XTcRAHM7AWKbNjaXCEgxk1Y/atmmmQIDAQABo3sw
eTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBD
ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUpQ3d1kfGJHQg9GJ39qljPlLSimYwHwYDVR0j
BBgwFoAUpQ3d1kfGJHQg9GJ39qljPlLSimYwDQYJKoZIhvcNAQEFBQADgYEAHk70
5MkzUoVprrQqNzdEkJtSs+mJHLLyF0HYBQJjmk9kTcnODIFIIk9zikz3uL9ksneK
LkOAOQPeJxkJ0og5EY+LSzfAEmjveVso1M/JuOF3JG60W4NKRkmhrVy32NpJmkVz
uY7rGpwubHDTxducRgJZQr+tvCFM0Wtrp4czGms=
-----END CERTIFICATE-----
Data Base Updated
自签署成功后,在/etc/pki/CA目录下将生成一系列文件。
[root@xuexi tmp]# tree -C /etc/pki/CA
/etc/pki/CA
├── certs
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│ └── .pem
├── private
│ └── cakey.pem
├── serial
└── serial.old
其中newcerts目录下的01.pem即为刚才自签署的证书文件,因为它是CA自身的证书,所以根据配置文件中的"certificate=$dir/cacert.pem"项,应该将其放入/etc/pki/CA目录下,且命名为cacert.pem,只有这样以后才能签署其它证书请求。
[root@xuexi tmp]# cp /etc/pki/CA/newcerts/.pem /etc/pki/CA/cacert.pem
至此,自建CA就完成了,查看下数据库索引文件和序列号文件。
[root@xuexi tmp]# cat /etc/pki/CA/index.txt
V 180627100629Z unknown /C=CN/ST=FJ/O=JM/OU=IT/CN=www.iwant.com [root@xuexi tmp]# cat /etc/pki/CA/serial
那么,下次签署证书请求时,序列号将是"02"。
将上述自建CA的过程总结如下:
[root@xuexi tmp]# touch /etc/pki/CA/index.txt
[root@xuexi tmp]# echo "" > /etc/pki/CA/serial
[root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem
[root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr
[root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr
[root@xuexi tmp]# cp /etc/pki/CA/newcerts/.pem /etc/pki/CA/cacert.pem
以上过程是完全读取默认配置文件创建的,其实很多过程是没有那么严格的,openssl ca命令自身可以指定很多选项覆盖配置文件中的项,但既然提供了默认的配置文件及目录结构,为了方便管理,仍然建议完全采用配置文件中的项。
(2).为他人颁发证书。
首先申请者创建一个证书请求文件。
[root@xuexi tmp]# openssl req -new -key privatekey.pem -out youwant1.csr
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) [XX]:CN
State or Province Name (full name) []:FJ
Locality Name (eg, city) [Default City]:XM
Organization Name (eg, company) [Default Company Ltd]:JM
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:www.youwant.com
Email Address []:. Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.
其中Country Name、State or Province Name、Organization Name和Common Name必须提供,且前三者必须和CA的subject中的对应项完全相同。这些是由配置文件中的匹配策略决定的。
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
policy = policy_match
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
"match"表示openssl ca要签署的证书请求文件中的项要和CA证书中的项匹配,即要相同,"supplied"表示必须要提供的项,"optional"表示可选项,所以可以留空。
现在就可以将证书请求文件发送给CA,让CA帮忙签署。
[root@xuexi tmp]# openssl ca -in youwant1.csr
签署成功后,查看下/etc/pki/CA下的文件结构。
[root@xuexi tmp]# tree -C /etc/pki/CA/
/etc/pki/CA/
├── cacert.pem
├── certs
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── newcerts
│ ├── .pem
│ └── .pem
├── private
│ └── cakey.pem
├── serial
└── serial.old directories, files
其中"02.pem"就是刚才签署成功的证书,将此证书发送给申请者即表示颁发完成。
再看下数据库索引文件和序列号文件。
[root@xuexi tmp]# cat /etc/pki/CA/index.txt
V 180627100629Z unknown /C=CN/ST=FJ/O=JM/OU=IT/CN=www.iwant.com
V 180627110022Z unknown /C=CN/ST=FJ/O=JM/CN=www.youwant.com [root@xuexi tmp]# cat /etc/pki/CA/serial
(3).openssl ca命令用法
经过上面的示例,应该对openssl ca命令的用法大致了解了,下面是其完整的用法说明,不包括crl相关功能。
openssl ca [-verbose] [-config filename] [-name section] [-startdate date] [-enddate date] [-days arg] [-md arg] [-policy arg] [-keyfile arg] [-key arg] [-passin arg] [-cert file]
[-selfsign] [-in file] [-out file] [-notext] [-outdir dir] [-infiles] [-ss_cert file] [-preserveDN] [-noemailDN] [-batch] [-extensions section] [-extfile section] [-subj arg] [-utf8]
要注意,ca命令是用于签署证书的,所以它所需要的文件除了配置文件外就是私钥文件和证书请求文件,而签名后生成的文件是证书文件,因此使用"-in"指定的对象是待签署文件,"-infiles"则是指定多个待签署文件,"-keyfile"是指定私钥文件,"-out"是指定输出的证书文件。
【选项说明:】
-config filename :指定要使用的配置文件,指定后将忽略openssl.cnf中指定的关于ca的配置选项。
-name section :指定使用配置文件中的那个section。指定后将忽略openssl.cnf中的default_ca段。
-in filename :指定要被CA签署的单个证书请求文件。根CA为其他证书签署时使用。
-infiles :该选项只能是最后一个选项,该选项所接的所有参数都被认为是要被签署的证书请求文件,即一次性签署多个请求文件时使用的选项。
-selfsign :自签署。指定-ss_cert选项时该选项被忽略。
-ss_cert filename:将被CA自签署的单个证书文件。也就是说要重新签署证书。
-out filename :证书的输出文件,同时也会输出到屏幕。不指定时默认输出到stdout。
-outdir dir_name :证书的输出目录。指定该选项时,将自动在此目录下生成一个文件名包含16进制serial值的".pem"证书文件。
-cert :CA自己的证书文件。
-keyfile filename:指定签署证书请求时的私钥文件,即CA自己的私钥文件。
-key passwd_value:指定私钥的加密密码。
-passin arg :传递解密密码
-verbose :打印操作执行时的详细信息
-notext :禁止以文本格式将证书输出到"-out"指定的文件中
-days arg :证书有效期限,从创建时刻开始算startdate,有效期结束点为enddate。
-startdate :自定义证书的开始时间,和"-enddate"一起使用可以推算出证书有效期。
-enddate :自定义证书的结束时间。
-md alg :指定单向加密算法
-policy arg :该选项是配置文件中的section内容,该选项指定了证书信息中的field部分是否需要强制提供还是要强制匹配,
:或者可提供可不提供。详细的见配置文件说明。
-extensions section:指定当前创建的证书使用配置文件中的哪个section作为扩展属性。
-batch :签署时使用批处理模式,即非交互模式。该模式下不会有两次询问(是否签署、是否提交)。
-subj arg :替换证书请求中的subject,格式/type0=value0/type1=value1/type2=...
配置文件关于ca的部分,其中被标记为必须项的表示配置文件中或者命令行中必须给出该选项及其值。
new_certs_dir :等同于"-outdir"选项。必须项
certificat :等同于"-cert"选项,CA自己的证书文件。必须项
private_key :等同于"-keyfile"选项,签署证书请求文件时的私钥文件,即CA自己的私钥文件。必须项
default_days :等同于"-days"选项
default_startdate:等同于"-startdate"选项。
default_enddate :等同于"-enddate"选项。
default_md :等同于"-md"选项。必须项
database :openssl维护的数据库文件。存放证书条目信息及状态信息。必须项
serial :已颁发证书的序列号(16进制)文件。必须项且该文件中必须存在一个序列值
unique_subject :如果设置为yes,database中的subject列值必须不重复。如果设置为no,允许subject重复。默认是yes,
:这是为了兼容老版本的Openssl,推荐设置为no。
x509_extensions :等同于"-extensions"选项。
policy :等同于"-policy"选项。必须项
name_opt/cert_opt:证书的展示格式,虽非必须但建议设置为ca_default,若不设置将默认使用老版本的证书格式(不建议如此)。
:伪命令ca无法直接设置这两个选项,而伪命令x509的"-nameopt"和"-certopt"选项可以分别设置。
copy_extensions :决定证书请求中的扩展项如何处理的。如果设置为none或不写该选项,则扩展项被忽略并且不复制到证书中去。
:如果设置为copy,则证书请求中已存在而证书中不存在的扩展项将复制到证书中。
:如果设置为copyall,则证书请求中所有的扩展项都复制到证书中,此时若证书中已存在某扩展项,则先删除再复制。
:该选项的主要作用是允许证书请求为特定的扩展项如subjectAltName提供值。
:使用该选项前请先查看man ca中的WARNINGS部分。建议一般简单使用时设置为none或不设置。
openssl ca(签署和自建CA)的更多相关文章
- (13) openssl ca(签署和自建CA)
用于签署证书请求.生成吊销列表CRL以及维护已颁发证书列表和这些证书状态的数据库.因为一般人无需管理crl,所以本文只介绍openssl ca关于证书管理方面的功能. 证书请求文件使用CA的私钥签署之 ...
- 自建CA实现HTTPS
说明:这里是Linux服务综合搭建文章的一部分,本文可以作为自建CA搭建https网站的参考. 注意:这里所有的标题都是根据主要的文章(Linux基础服务搭建综合)的顺序来做的. 如果需要查看相关软件 ...
- 基于OpenSSL自建CA和颁发SSL证书
关于SSL/TLS介绍见文章 SSL/TLS原理详解.关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 . openssl是一个开源程序的套件.这个套件有三个 ...
- 使用OpenSSL自建CA + Nginx配置HTTPS
Ubuntu 16.04(ECS),OpenSSL 1.0.2g 1 Mar 2016,Nginx 1.10.3 (Ubuntu), 浏览器:Chrome 67,Firefox 61,Edge 40 ...
- Https、OpenSSL自建CA证书及签发证书、nginx单向认证、双向认证及使用Java访问
0.环境 本文的相关源码位于 https://github.com/dreamingodd/CA-generation-demo 必须安装nginx,必须安装openssl,(用apt-get upd ...
- openssl req(生成证书请求和自建CA)(转)
openssl req(生成证书请求和自建CA) 伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中 ...
- openssl 自建CA签发证书 网站https的ssl通信
<<COMMENTX509 文件扩展名 首先我们要理解文件的扩展名代表什么.DER.PEM.CRT和CER这些扩展名经常令人困惑.很多人错误地认为这些扩展名可以互相代替.尽管的确有时候有些 ...
- Openssl自建CA
查看证书相关指令 # 查看公钥数字证书 openssl x509 -in cacert.pem -noout -text # 查看私钥数字证书 openssl pkcs12 -in client-ce ...
- 安全和加密——openssl及自建CA
一.对称加密算法 对称加密:加密和解密使用共用一个秘钥 特点 加密.解密使用同一个秘钥,效率高: 将原始数据分割成固定大小的块,逐个进行加密 缺点 密钥过多,密钥需要分发 数据来源无法确认 1. 使用 ...
随机推荐
- MyBatis之级联——一对一关系
在学数据库概论的时候会听到这么几个词:数据库的关系分为一对一.一对多.多对多.对于在学校里学的知识已经忘得差不多了,在这里简单的提一下数据库的关系.此篇是介绍MyBatis是如何实现数据库中一对一关系 ...
- JSP----获取表单参数
在页面中可大量使用 request 对象来获取表单域的值,获取表单域的值有如下两个 方法. • String getParamete(String para mN ame): 获取表单域的值. • S ...
- 前端魔法堂:屏蔽Backspace导致页面回退
前言 前几天用户反映在录入资料时一不小心错按Backspace键,就会直接回退到是一个页面,导致之前辛辛苦苦录入的资料全部丢失了.哦?居然还有这种情况.下面我们来一起探讨一下吧! Windows系统 ...
- pod install 出现 Unable to find a specification for `xxxxx` 解决方案
pod repo update 更新一下repo,更新完成之后即可解决无法找到xxx第三方框架的问题了
- 导出CSV,导出excel数字过长显示科学计数法解决方案
再导出CSV表格时发现数字超过一定长度后会缩写成科学计数法,对于手机号和身份证就比较尴尬了. 在网上找了一下,大部分都是加"'"将数字转换为字符串,但是纠结于导出的数字前面有个单引 ...
- 开涛spring3(6.3) - AOP 之 6.3 基于Schema的AOP
6.3 基于Schema的AOP 基于Schema的AOP从Spring2.0之后通过“aop”命名空间来定义切面.切入点及声明通知. 在Spring配置文件中,所以AOP相关定义必须放在<a ...
- java web 数据库开发1
一个完整的数据库部署架构通常由客户端和服务器端两部分组成.客户端封装数据库请求将其发送给服务器端,服务器端执行完毕将其及结果返回给服务器端. 以mysql为例 介绍java应用程序对数据库的访问 JD ...
- flash2print文档在线预览应用(java,.net)
一.背景 前段时间,LZ的boss突然给了出了这样一个需求:将原项目中的所有文章关联的附件TXT.PDF.office相关文件全部以flash的形式在网页上进行展示,便于预览.看似简单的需求,整个研发 ...
- 一天搞定HTML----a标签02
1.细说a标签 2.代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- RedHat6.2 x86手动配置LNMP环境
因为公司要求用RedHat配,顺便让我练习一下Linux里面的操作什么的. 折腾来折腾去终于搞好了,其实也没那么难嘛.但是也要记录一下. 首先,是在服务器里面用VMware搭建的RedHat6.2 x ...