码迷,mamicode.com
首页 > 其他好文 > 详细

使用OpenSSL构建私有CA

时间:2015-04-25 00:24:30      阅读:306      评论:0      收藏:0      [点我收藏+]

标签:ca   out   openssl   genrsa   

一、什么是CA

    CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。

二、为什么使用CA

    CA是PKI(Public Key Infrastructure)体系的核心。它为客户的公开密钥签发公钥证书、发放证书和管理证书,并提供一系列密钥生命周期内的管理服务。它将客户的公 钥与客户的名称及其他属性关联起来,为客户之间电子身份进行认证。证书中心是一个具有权威性、可信赖性和公证性的第三方机构。它是电子商务存在和发展的基础。

    简单的说,使用CA不仅能保证数据的安全传输,还能保证目标的可信赖性。


三、CA配置文件主要内容详解

    CA 配置文件:/etc/pki/tls/openssl.cnf

####################################################################
[ ca ]
default_ca      = CA_default            # The default ca section

####################################################################
[ CA_default ] //定义openssl作为CA使用时相关配置

dir             = /etc/pki/CA           # openssl作为CA使用时路径
certs           = $dir/certs            # 已颁发证书的存储位置
crl_dir         = $dir/crl              # 已吊销证书的吊销列表的存放位置
database        = $dir/index.txt        # 证书索引文件                (默认没有需要创建)
#unique_subject = no                    # Set to ‘no‘ to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # 新颁发证书的存储位置

certificate     = $dir/cacert.pem       # CA的公钥文件名
serial          = $dir/serial           # 记录过去签发的所有证书的序列号【每签发一个证书 自动+ 1】 (文本文件 需要创建)
crlnumber       = $dir/crlnumber        # 已吊销证书编号
                                      
crl             = $dir/crl.pem          # 证书吊销列表
private_key     = $dir/private/cakey.pem# CA自己的私钥文件
RANDFILE        = $dir/private/.rand    # 随机数的获取位置 (隐藏文件)

x509_extensions = usr_cert              # 用户证书                                                    


default_days    = 365                   # 颁发证书默认有效时间
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering

==============================================================================
   [ policy_match]
    此段为证书相关信息选项,其中match指定的项,要求被签名证书一定要与CA的对应项一致。

    [ req_distinguished_name ]
    此段为CA证书的默认配置

四、CA服务器的建立

    1、生成私钥文件  

  注:其保存路径及名字在配置文件[/etc/pki/tls/openssl.cnf]中已经定义:/etc/pki/CA/private/cakey.pem

    # openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048

    genrsa            

        用于生成 RSA 密钥对的 OpenSSL 命令。

       -out:输出文件保存位置

       2048:表示秘钥强度也可以使1024

      

注:由于私钥文件被篡改后将会导致无法估计的灾难,所以一般都会对其进行权限的限制可以使用两种方法:
    一、# openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
        # chmod 400 /etc/pki/CA/private/cakey.pem
    二、# (umask 077;openssl genrsa -out private/cakey.pem 1024)


步骤:
[root@1inux CA]# (umask 077;openssl genrsa -out private/cakey.pem 1024)
Generating RSA private key, 1024 bit long modulus
......++++++
...............................................................++++++
e is 65537 (0x10001)
[root@1inux CA]# ls private/        //确认文件是否生成
cakey.pem
[root@1inux CA]# cat private/cakey.pem  //查看其内容
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCof9h3G1ob35B0LpCJnngYqM6Epsnwjwr9gazmw/h/e+QhMh9+
87OAMAxwpdDi+xPdErbt32ck0Pjg4w3pgnNFIAadql/kDLaABzt+Pq4cDMS1cIC+
UuiSRrfn5wVDpDuM+HUc6JSEEEok8KEgKCRuJu/FeUwob0LFl/6blKkCdQIDAQAB
AoGAExZobxWqH34z3vVnai+Ja0G0I1LBjX6mwBDwhTOt8sMWFKyY5Mi2jM7kmd4u
y4eluGVmU4v7IzCJAPC3orwkUoFAHXk+C6172pwuGDgwQxYQtucjeKVMbROqTf6y
1DsxMv2HcsNN5xHQ4PIKOZwuRcW4Vrqh8l96Yr4ZHqxYgAECQQDP9uipdQrz3saH
TWOJzSaP2/jD4NrRvTzq8rO/QjaFasvtledohq6ARfMlkXi+5GuE9x9qI5ViSUGE
OhqiqgaVAkEAz2tWVgmTLqbkzxQFhj3PwKPgQ/2wcYvNoZWyvc1u2AHrka8y7CtF
BUJxsUvxHwwUs7EMBpVeCTlweW1xTv10YQJAIs93nnXjAXM21AsWMEjQvZ/agh8v
QZBllAZQJCGXMrnvrLM86vgwWXRcANva1Ekz3ivnbELMjIkqmFGJh9TiCQJBALJW
O5kmCmImJLzXHhjZtHKRdBWBXd+CsH6p01DV/OPEYuKTnFjqqyFmi5JBFUP4gyQs
qYZPjtaniEkfDDk6OoECQAEe6A44jkJ9LzU8UrigfVhwDqtmiigNLCfJzKZgHlF0
erLd2S3qNqNJSHVXNQ1URz/2hg4Z3CP3nAjHt6GpnY0=
-----END RSA PRIVATE KEY-----


    2、生成自签证书

    注:自签证书名字已经在配置文件中有定义:cacer.pem

    # openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days #

    命令:# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650

        -key    私钥文件(指明从哪个私钥文件中提取公钥创建证书签署请求)
        -out    指定证书文件存放在位置
        -new    生成新的证书签署请求;
        -days n   证书有效时长,单位为“天”;
        -x509    生成自签证书

    参数中带-x509表示直接生成自签证书,不带则表示生成证书签署请求】


[root@1inux CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
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) []:Henan        //省份
Locality Name (eg, city) [Default City]:ZZ     //地区
Organization Name (eg, company) [Default Company Ltd]:MQCHINA        //公司名称
Organizational Unit Name (eg, section) []:Ops    //公司的部门名称
Common Name (eg, your name or your server‘s hostname) []:1inux.mqchina.org    //CA服务器的主机名 【证书主机自己的名,必须和主机名一致否则,否则证书验证将无法通过,因为证书通信时将使用此名字进行验证】
Email Address []:root@mqchina.org        //管理员邮箱    
[root@1inux CA]# ls
cacert.pem  certs  crl  newcerts  private

    3、为了能使证书可以工作还需要创建两个文件

[root@1inux CA]# touch /etc/pki/CA/index.txt
[root@1inux CA]# echo 01 > /etc/pki/CA/serial
[root@1inux CA]#

  OK CA 证书服务器已经搭建完成


五、生成CA用户证书签署请求

    1、生成私钥

[root@1inux ssl]# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
.++++++
.............++++++
e is 65537 (0x10001)
[root@1inux httpd]#

    2、生成请求签署文件

【注 申请时 此文件中的国家 州 地区以及公司名字必须与CA一致,否则无法签署成功,但Common Name 不能和CA一样】

[root@1inux ssl]# openssl req -new -key /etc/httpd/ssl/httpd.key -out httpd.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) []:Henan    //同上
Locality Name (eg, city) [Default City]:ZZ    //同上
Organization Name (eg, company) [Default Company Ltd]:MQCHINA    //同上
Organizational Unit Name (eg, section) []:Ops    //可自行设置
Common Name (eg, your name or your server‘s hostname) []: www.freelove.com    //不能和CA的一样,否则无法签署成功 【此名字是在互联网中被访问到的名字】
Email Address []:root@mqchina.org

Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:    //为了保证证书在互联网中传输安全可以添加密码,如果不想设置密码可以两次回车
An optional company name []:
[root@1inux ssl]# ls
httpd.csr  httpd.key
[root@1inux ssl]#


    注:证书签署请求文件后缀为csr

六、签署证书

    以上步骤完成后,接下来我们就可以用先前建立的CA来对用户的证书请求进行签名来为用户签发证书了

语法:

    # openssl ca -in /PATH/FROM/CSR_FILE -out /PATH/TO/CRT_FILE -days N

                -in     证书请求签署文件

                -out    签发后的证书文件

                -days    证书有效天数

[root@1inux CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Apr 15 15:55:25 2015 GMT
            Not After : Apr 12 15:55:25 2025 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = Henan
            organizationName          = MQCHINA
            organizationalUnitName    = Ops
            commonName                = www.freelove.com
            emailAddress              = root@mqchina.org
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                78:B2:6D:35:0B:87:24:25:57:03:C4:8A:7B:4A:09:BC:8D:96:16:A5
            X509v3 Authority Key Identifier: 
                keyid:51:14:D6:51:14:4D:27:1F:A7:5A:7E:91:5D:E1:94:95:AB:9D:C2:DE
Certificate is to be certified until Apr 12 15:55:25 2025 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
[root@1inux CA]# cat index.txt    //在证书索引文件中可以看到我们的证书已经有效了
V    250412155525Z        01    unknown    /C=cn/ST=Henan/O=MQCHINA/OU=Ops/CN=www.freelo/emailAddress=root@mqchina.org
[root@1inux CA]#

注:CA证书文件后缀为:crt

如果在签署ca时出现如下错误,说明未创建/etc/pki/CA/index.txt文件,参考上文配置文件
[root@1inux CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/index.txt: No such file or directory
unable to open ‘/etc/pki/CA/index.txt‘
140002251192136:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen(‘/etc/pki/CA/index.txt‘,‘r‘)
140002251192136:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

解决方案:[root@1inux CA]# touch /etc/pki/CA/index.txt


如果在签署ca时出现如下错误,说明未创建/etc/pki/CA/serial文件,参考上文配置文件
[root@1inux CA]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory
error while loading serial number
140381399570248:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen(‘/etc/pki/CA/serial‘,‘r‘)
140381399570248:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

解决方案:[root@1inux CA]# echo 01 > /etc/pki/CA/serial

    //serial是记录签发证书的序列号,所以创建后要对其赋值00 或其他,然后每签发一个证书自动+1


七、签署证书

    1、获取吊销证书的序列号

    # openssl x509 -in /PATH/FROM/CRT_FILE -noout -serial -subject

            -noout 不获取证书本身数据信息

            -serial

eg1:
[root@1inux CA]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject
serial=01
subject= /C=cn/ST=Henan/O=MQCHINA/OU=Ops/CN=www.freelove.com/emailAddress=root@mqchina.org

eg2:
[root@1inux CA]# openssl x509 -in /etc/httpd/ssl/httpd.crt -serial -subject
serial=01
subject= /C=cn/ST=Henan/O=MQCHINA/OU=Ops/CN=www.freelove.com/emailAddress=root@mqchina.org
-----BEGIN CERTIFICATE-----
MIIC8jCCAlugAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMCY24x
DjAMBgNVBAgMBUhlbmFuMQswCQYDVQQHDAJaWjEQMA4GA1UECgwHTVFDSElOQTEM
MAoGA1UECwwDT3BzMRowGAYDVQQDDBExaW51eC5tcWNoaW5hLm9yZzEfMB0GCSqG
SIb3DQEJARYQcm9vdEBtcWNoaW5hLm9yZzAeFw0xNTA0MTUxNTU1MjVaFw0yNTA0
MTIxNTU1MjVaMHkxCzAJBgNVBAYTAmNuMQ4wDAYDVQQIDAVIZW5hbjEQMA4GA1UE
CgwHTVFDSElOQTEMMAoGA1UECwwDT3BzMRkwFwYDVQQDDBB3d3cuZnJlZWxvdmUu
Y29tMR8wHQYJKoZIhvcNAQkBFhByb290QG1xY2hpbmEub3JnMIGfMA0GCSqGSIb3
DQEBAQUAA4GNADCBiQKBgQDKYueANyldFj6y0o2IaNcZbEmozcnAUq5hkvcEja9N
oN300uWjU4EEw1Rv6UrIp3c5eKgFLaYtHu3g/AN/g+U7neU2UbLmUh+ol1a13/PI
HGu9vPrCJhLqpcVRSm5p3mfHPDRIQ/XF+6gwiFZfZTuDl0ZpvfHm7e24KIpMw0/J
lQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl
bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUeLJtNQuHJCVXA8SKe0oJvI2W
FqUwHwYDVR0jBBgwFoAUURTWURRNJx+nWn6RXeGUlaudwt4wDQYJKoZIhvcNAQEF
BQADgYEABkzuiQr1V6isqlp7fRuyuuKGWx9sRGvAPTdmEu8hAZ4TVczOuuoygem9
axGREdtrrvEGN03nIbb0d6t4F/zGrKrDAAdq6ehAMdwBz5hvpZY7Dn67Jg8heIZJ
I2B/ApmYH5gHJ3XfOOEP8KOJ8Ieor+eNWPYNpvh6GId8czpjKks=
-----END CERTIFICATE-----
[root@1inux CA]#

    2、实现证书吊销

        2.1、吊销证书

            # openssl ca -revoke /PATH/FROM/CRT_FILE

[root@1inux CA]# openssl ca -revoke /etc/httpd/ssl/httpd.crt 
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
[root@1inux CA]#

        2.2、生成吊销证书的编号
            # echo 01 > /etc/pkie/CA/crlnumber

[root@1inux CA]# echo 01 > /etc/pki/CA/crlnumber
[root@1inux CA]#

        2.3、更新证书吊销列表

            # openssl crl -gencrl -out THISCA.crl

===============================================================================

Openssl 证书文件类型及概念
    证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL 、OCSP、SCEP等。
PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
内容类型:表明本文件存放的是什么信息内容,它的形式为“——-BEGIN XXXX ——”,与结尾的“——END XXXX——”对应。
头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量 iv。
信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。
使用PEM格式存储的证书:
—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–
使用PEM格式存储的私钥:
—–BEGIN RSA PRIVATE KEY—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END RSA PRIVATE KEY—–
使用PEM格式存储的证书请求文件:
—–BEGIN CERTIFICATE REQUEST—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE REQUEST—–
DER – 辨别编码规则 (DER) 可包含所有私钥、公钥和证书。它是大多数浏览器的缺省格式,并按 ASN1 DER 格式存储。它是无报头的 - PEM 是用文本报头包围的 DER。
PFX 或 P12 – 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书。其以二进制格式存储,也称为 PFX 文件。通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件。转换时需要输入PFX文件的加密密码。
JKS – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式”转换为标准的Java Key Store(JKS)文件。JKS文件格式被广泛的应用在基于JAVA的WEB服务器、应用服务器、中间件。你可以将JKS文件导入到TOMCAT、 WEBLOGIC 等软件。
KDB – 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式转换为标准的IBM KDB文件。KDB文件格式被广泛的应用在IBM的WEB服务器、应用服务器、中间件。你可以将KDB文件导入到IBM HTTP Server、IBM Websphere 等软件。
CSR - 证书请求文件(Certificate Signing Request)。生成 X509 数字证书前,一般先由用户提交证书申请文件,然后由 CA 来签发证书。大致过程如下(X509 证书申请的格式标准为 pkcs#10 和 rfc2314):
用户生成自己的公私钥对;
构造自己的证书申请文件,符合 PKCS#10 标准。该文件主要包括了用户信息、公钥以及一些可选的属性信息,并用自己的私钥给该内容签名;
用户将证书申请文件提交给 CA;
CA 验证签名,提取用户信息,并加上其他信息(比如颁发者等信息),用 CA 的私钥签发数字证书;
说 明:数字证书(如x.509)是将用户(或其他实体)身份与公钥绑定的信息载体。一个合法的数字证书不仅要符合 X509 
格式规范,还必须有 CA 的签名。用户不仅有自己的数字证书,还必须有对应的私钥。X509v3 
数字证书主要包含的内容有:证书版本、证书序列号、签名算法、颁发者信息、有效时间、持有者信息、公钥信息、颁发者 ID、持有者 ID 和扩展项。
OCSP – 在线证书状态协议(OCSP,Online Certificate Status 
Protocol,rfc2560)用于实时表明证书状态。OCSP 客户端通过查询 OCSP 
服务来确定一个证书的状态,可以提供给使用者一个或多个数字证书的有效性资料,它建立一个可实时响应的机制,让用户可以实时确认每一张证书的有效性,解决
 由CRL引发的安全问题。。OCSP 可以通过 HTTP协议来实现。rfc2560 定义了 OCSP 客户端和服务端的消息格式。
CER  - 一般指使用DER格式的证书。
CRT - 证书文件。可以是PEM格式。
KEY   - 一般指PEM格式的私钥文件。
CRL -
 证书吊销列表 (Certification Revocation List) 是一种包含撤销的证书列表的签名数据结构。CRL 
是证书撤销状态的公布形式,CRL 就像信用卡的黑名单,用于公布某些数字证书不再有效。CRL 
是一种离线的证书状态信息。它以一定的周期进行更新。CRL 可以分为完全 CRL和增量 CRL。在完全 CRL 中包含了所有的被撤销证书信息,增量
 CRL 由一系列的 CRL 来表明被撤销的证书信息,它每次发布的 CRL 是对前面发布 CRL 的增量扩充。基本的 CRL 
信息有:被撤销证书序列号、撤销时间、撤销原因、签名者以及 CRL 签名等信息。基于 CRL 的验证是一种不严格的证书认证。CRL 能证明在 
CRL 中被撤销的证书是无效的。但是,它不能给出不在 CRL 中的证书的状态。如果执行严格的认证,需要采用在线方式进行认证,即 OCSP 
认证。一般是由CA签名的一组电子文档,包括了被废除证书的唯一标识(证书序列号), CRL用来列出已经过期或废除的数字证书。它每隔一段时间就会更新,因此必须定期下载该清单,才会取得最新信息。
SCEP - 简单证书注册协议。基于文件的证书登记方式需要从您的本地计算机将文本文件复制和粘贴到证书发布中心,和从证书发布中心复制和粘贴到您的本地计算机。 SCEP可以自动处理这个过程但是CRLs仍然需要手工的在本地计算机和CA发布中心之间进行复制和粘贴。
PKCS7 – 加密消息语法(pkcs7),是各种消息存放的格式标准。这些消息包括:数据、签名数据、数字信封、签名数字信封、摘要数据和加密数据。
PKCS12 – pkcs12 (个人数字证书标准)用于存放用户证书、crl、用户私钥以及证书链。pkcs12 中的私钥是加密存放的


本文出自 “无常” 博客,请务必保留此出处http://1inux.blog.51cto.com/10037358/1638154

使用OpenSSL构建私有CA

标签:ca   out   openssl   genrsa   

原文地址:http://1inux.blog.51cto.com/10037358/1638154

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!