`
walksing
  • 浏览: 217671 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

基于 OpenSSL 的 CA 建立及证书签发 (2009-03-08 01:44)

 
阅读更多
基于 OpenSSL 的 CA 建立及证书签发 (2009-03-08 01:44)
分类: Linux




前段时间研究了一下 SSL/TLS ,看的是 Eric Rescorla 的 SSL and TLS - Designing and Building Secure Systems 的中文版(关于该中文版的恶劣程度,我在之前的一篇 Blog 中已做了严厉的批判)。本书的作者沿袭了 Stevens 在其神作 TCP/IP Illustrated 中的思想:使用网络嗅探进行协议演示。不同的是,作者并没有使用 tcpdump ,而是使用了自己编写的专用于嗅探 SSL/TLS 通讯的 ssldump 。为了对书中的一些内容进行试验确认,我决定使用 ssldump 进行一些实验。然而,进行 SSL/TLS 通讯,至少需要一份 CA 签发的证书才可以得以完成,仅仅是做个实验,我自然不会花天价去买个证书,所以决定自己建 CA 签发证书。

然而,到今天为止,我也没有能够成功地利用 ssldump 嗅探出一个 SSL/TLS 通讯包。为啥?只因为用 OpenSSL 建立 CA 签发证书的过程太麻烦了,以至于我忙活了好久才勉强建了个 CA ,之后又由于其他的事情,耽搁了 ssldump 的实验,于是就一直没有下文了。

什么?有免费的知名 CA 可以提供证书?咳……这个,我也是事后才知道的……不过,利用 OpenSSL 建立 CA 及自行签发证书的过程倒是很值得一写。 OpenSSL 的 ca 命令实在是难用,难怪 ca (1) 的 manpage 中这样写到:

WARNINGS

The ca command is quirky and at times downright unfriendly.

The ca utility was originally meant as an example of how to do things in a CA. It was not supposed to be used as a full blown CA itself: nevertheless some people are using it for this purpose.

The ca command is effectively a single user command: no locking is done on the various files and attempts to run more than one ca command on the same database can have unpredictable results.

看来,我们这些非要用 OpenSSL 来做 CA 的人本来就是自找麻烦。不过,虽然 OpenSSL 的用户界面让人望而却步,就其功能而言,恐怕是各个相关 FOSS 产品中最为完备的一款,加之获取方便,在 Debian 下直接 aptitude install openssl 便可以安装, Win32 下的话,也可以方便地从在 cygwin 官方镜像站上获取。况且,作为信息安全方面的新手,我对其他相关产品也是一无所知。所以,还是硬着头皮去啃 OpenSSL 的 man 手册。利用了两三天的闲暇时间,在 kghost 的帮助下,我终于掌握了要点。下文便详细记录了基于 OpenSSL 的 CA 建立及证书签发过程。

建立 CA 建立 CA 目录结构
按照 OpenSSL 的默认配置建立 CA ,需要在文件系统中建立相应的目录结构。相关的配置内容一般位于 /usr/ssl/openssl.cnf (SUSE => /etc/ssl/openssl.cnf)内,详情可参见 config (1) 。在终端中使用如下命令建立目录结构:

$ mkdir -p ./demoCA/{private,newcerts}
$ touch ./demoCA/index.txt
$ echo 01 > ./demoCA/serial

产生的目录结构如下:

.
`-- demoCA/
    |-- index.txt
    |-- newcerts/
    |-- private/
    `-- serial


生成 CA 证书的 RSA 密钥对
首先,我们要为 CA 建立 RSA 密钥对。打开终端,使用如下命令生成 RSA 密钥对:

$ openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048

参数解释
genrsa

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

-des3

使用 3-DES 对称加密算法加密密钥对,该参数需要用户在密钥生成过程中输入一个口令用于加密。今后使用该密钥对时,需要输入相应的口令。如果不加该选项,则不对密钥进行加密。

-out ./demoCA/private/cakey.pem

令生成的密钥对保存到文件 ./demoCA/private/cakey.pem 。

2048

RSA 模数位数,在一定程度上表征了密钥强度。

该命令输出如下,用户应输入自己的密钥口令并确认:

Generating RSA private key, 2048 bit long modulus................................................+++.........................+++e is 65537 (0x10001)Enter pass phrase for ./demoCA/private/cakey.pem:<enter your pass-phrase>Verifying - Enter pass phrase for ./demoCA/private/cakey.pem:<re-enter your pass-phrase>生成 CA 证书请求
为了获取一个 CA 根证书,我们需要先制作一份证书请求。先前生成的 CA 密钥对被用于对证书请求签名。

$ openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem

参数解释
req

用于生成证书请求的 OpenSSL 命令。

-new

生成一个新的证书请求。该参数将令 OpenSSL 在证书请求生成过程中要求用户填写一些相应的字段。

-days 365

从生成之时算起,证书时效为 365 天。

-key ./demoCA/private/cakey.pem

指定 ./demoCA/private/cakey.pem 为证书所使用的密钥对文件。

-out careq.pem

令生成的证书请求保存到文件 careq.pem 。

该命令将提示用户输入密钥口令并填写证书相关信息字段,输出如下:

Enter pass phrase for ./demoCA/private/cakey.pem:<enter you 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.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:ZJ
Locality Name (eg, city) []:HZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Some Ltd. Corp.
Organizational Unit Name (eg, section) []:Some Unit
Common Name (eg, YOUR name) []:Someone
Email Address []:some@email.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

对 CA 证书请求进行签名
在实际应用中,用户可以通过向知名 CA 递交证书请求来申请证书。但是在这里,我们需要建立的是一个根 CA ,只能由我们自己来对证书请求进行签名。所以我们让 OpenSSL 使用证书请求中附带的密钥对对该请求进行签名,也就是所谓的“ self sign ”:

$ openssl ca -selfsign -in careq.pem -out cacert.pem

参数解释
ca

用于执行 CA 相关操作的 OpenSSL 命令。

-selfsign

使用对证书请求进行签名的密钥对来签发证书。

-in careq.pem

指定 careq.pem 为证书请求文件。

-out ./demoCA/cacert.pem

指定 ./demoCA/cacert.pem 为输出的证书。

该命令要求用户输入密钥口令并输出相关证书信息,请求用户确认:

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:<enter your pass-phrase>
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jan 16 13:05:09 2008 GMT
            Not After : Jan 15 13:05:09 2009 GMT
        Subject:
            countryName = CN
            stateOrProvinceName = ZJ
            organizationName = Some Ltd. Corp.
            organizationalUnitName = Some Unit
            commonName = Someone
            emailAddress = some@email.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                75:F5:3C:CC:C1:5E:6D:C3:8B:46:A8:08:E6:EA:29:E8:22:7E:70:03
            X509v3 Authority Key Identifier:
                keyid:75:F5:3C:CC:C1:5E:6D:C3:8B:46:A8:08:E6:EA:29:E8:22:7E:70:03

Certificate is to be certified until Jan 15 13:05:09 2009 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 证书请求生成及签名
以上两个步骤可以合二为一。利用 ca 命令的 -x509 参数,通过以下命令同时完成证书请求生成和签名从而生成 CA 根证书:

$ openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

参数解释
req

用于生成证书请求的 OpenSSL 命令。

-new

生成一个新的证书请求。该参数将令 OpenSSL 在证书请求生成过程中要求用户填写一些相应的字段。

-x509

生成一份 X.509 证书。

-days 365

从生成之时算起,证书时效为 365 天。

-key ./demoCA/private/cakey.pem

指定 cakey.pem 为证书所使用的密钥对文件。

-out ./demoCA/cacert.pem

令生成的证书保存到文件 ./demoCA/cacert.pem 。

该命令输出如下,用户应输入相应的字段:

Enter pass phrase for ./demoCA/private/cakey.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) [AU]:CN
State or Province Name (full name) [Some-State]:ZJ
Locality Name (eg, city) []:HZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Some Ltd. Corp.
Organizational Unit Name (eg, section) []:Some Unit
Common Name (eg, YOUR name) []:Someone
Email Address []:some@email.com

至此,我们便已成功建立了一个私有根 CA 。在这个过程中,我们获得了一份 CA 密钥对文件 ./demoCA/private/cakey.pem 以及一份由此密钥对签名的 CA 根证书文件 ./demoCA/cacert.pem ,得到的 CA 目录结构如下:

.
|-- careq.pem
`-- demoCA/
    |-- cacert.pem
    |-- index.txt
    |-- index.txt.attr
    |-- index.txt.old
    |-- newcerts/
    |   `-- 01.pem
    |-- private/
    |   `-- cakey.pem
    |-- serial
    `-- serial.old

注:如果在 CA 建立过程中跳过证书请求生成的步骤,则不会产生 careq.pem 文件。

签发证书
下面我们就可以利用建立起来的 CA 进行证书签发了。

生成用户证书 RSA 密钥对
参照 CA 的 RSA 密钥对生成过程,使用如下命令生成新的密钥对:

$ openssl genrsa -des3 -out userkey.pem
Generating RSA private key, 512 bit long modulus
....++++++++++++
...++++++++++++
e is 65537 (0x10001)
Enter pass phrase for userkey.pem:<enter your pass-phrase>
Verifying - Enter pass phrase for userkey.pem:<re-enter your pass-phrase>

生成用户证书请求
参照 CA 的证书请求生成过程,使用如下命令生成新的证书请求:

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem
Enter pass phrase for userkey.pem:<enter your 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.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:ZJ
Locality Name (eg, city) []:HZ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Some Ltd. Corp.
Organizational Unit Name (eg, section) []:Some Other Unit
Common Name (eg, YOUR name) []:Another
Email Address []:another@email.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

签发用户证书
现在,我们可以用先前建立的 CA 来对用户的证书请求进行签名来为用户签发证书了。使用如下命令:

$ openssl ca -in userreq.pem -out usercert.pem

参数解释
ca

用于执行 CA 相关操作的 OpenSSL 命令。

-in userreq.pem

指定用户证书请求文件为 userreq.pem 。

-out usercert.pem

指定输出的用户证书文件为 usercert.pem 。

该命令要求用户输入密钥口令并输出相关证书信息,请求用户确认:

Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:<enter your pass-phrase>
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Jan 16 14:50:22 2008 GMT
            Not After : Jan 15 14:50:22 2009 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = ZJ
            organizationName          = Some Ltd. Corp.
            organizationalUnitName    = Some Other Unit
            commonName                = Another
            emailAddress              = another@email.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                97:E7:8E:84:B1:45:27:83:94:A0:DC:24:79:7B:83:97:99:0B:36:A9
            X509v3 Authority Key Identifier:
                keyid:D9:87:12:94:B2:20:C7:22:AB:D4:D5:DF:33:DB:84:F3:B0:4A:EC:A2

Certificate is to be certified until Jan 15 14:50:22 2009 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 的建立及用户证书签发的全部工作。不妨把所有 shell 命令放到一起纵览一下:
# 建立 CA 目录结构
mkdir -p ./demoCA/{private,newcerts}
touch ./demoCA/index.txt
echo 01 > ./demoCA/serial

# 生成 CA 的 RSA 密钥对
openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048

# 生成 CA 证书请求
openssl req -new -days 365 -key ./demoCA/private/cakey.pem -out careq.pem

# 自签发 CA 证书
openssl ca -selfsign -in careq.pem -out ./demoCA/cacert.pem

# 以上两步可以合二为一
openssl req -new -x509 -days 365 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

# 生成用户的 RSA 密钥对
openssl genrsa -des3 -out userkey.pem

# 生成用户证书请求
openssl req -new -days 365 -key userkey.pem -out userreq.pem

# 使用 CA 签发用户证书
openssl ca -in userreq.pem -out usercert.pem

了解了这些基础步骤之后,就可以通过脚本甚至 makefile 的方式来将这些工作自动化。 CA.pl 和 CA.sh 便是对 OpenSSL 的 CA 相关功能的简单封装,在 Debian 系统中,安装了 OpenSSL 后,可以在 /usr/lib/ssl/misc/ 目录下找到这两个文件。而 makefile 的解决方案则可以参考这里。

参考文献
The Open–source PKI Book: A guide to PKIs and Open–source Implementations, Initialisation of the Certification Authority
http://ospkibook.sourceforge.net/docs/OSPKI-2.4.7/OSPKI-html/initialisation.htm
OpenSSL: Documents, OpenSSL(1)
http://www.openssl.org/docs/apps/openssl.html
OpenSSL Certificate Authority Setup
http://sial.org/howto/openssl/ca/

博客推荐文章
MAC+PHY的相关知识 (8分钟前) platform device (17分钟前) vm_area_struct及进程的虚拟空间 (22分钟前) linux 进程组 会话 (31分钟前) wbmin是一个很好的LINUX图形管理软件 (38分钟前)
分享到:
评论

相关推荐

    数字证书实战经验-Openssl自建CA中心及签发证书

    本实战经验主要关注如何使用OpenSSL这一开源库来建立自己的证书颁发机构(CA)中心,并签发不同级别的证书。 首先,让我们详细解释一下这个过程。`root-ca.cnf`、`intermediate-ca.cnf`和`index.cnf`是配置文件,...

    使用 OpenSSL 创建生成CA 证书服务器客户端证书及密钥

    本文将详细介绍如何使用 OpenSSL 创建和管理CA证书、服务器证书和客户端证书,以实现SSL单向认证和双向认证。 首先,我们来看一下如何生成 CA(证书颁发机构)证书。CA证书是信任的根,用于签署其他证书,确保网络...

    openssl 生成ca证书 pkcs12 pem格式转换

    在 OpenSSL 中,CA 证书是证书颁发机构的数字证书,用于签发其他证书。PKCS#12 是一种常用的证书格式,PEM 是一种文本格式,用于存储证书和私钥。 了解 OpenSSL 中的证书管理命令是非常重要的。下面是 OpenSSL 中的...

    openssl 创建ca 签发证书

    本文将深入讲解如何使用OpenSSL创建自己的CA(Certificate Authority)并签发证书,以及构建多级CA的实践过程。 首先,让我们了解什么是CA。CA是数字证书的颁发机构,它负责验证请求证书的实体身份,并为其签发具有...

    CA证书生成工具OpenSSL

    4. **配置信任**:在操作系统或应用程序中,你需要将这个CA证书添加到信任的根证书列表中,以便系统能够识别并接受由该CA签发的证书。 5. **签发服务器/用户证书**:有了CA证书后,你可以为服务器或用户提供证书。...

    利用openssl自制CA证书

    然而,要注意的是,虽然自制CA证书在本地环境或测试环境中很有用,但在生产环境中,应尽可能使用由公众信任的CA签发的证书,以确保全球用户都能无阻碍地信任你的网站或服务。此外,自行签发的证书如果被恶意利用,...

    openssl数据加解密及证书使用例子

    四、生成根证书CA及签发子证书 3.1 在OpenSSL中,我们可以创建自签名的根证书(Root CA),然后用它来签发服务器和客户端的证书,确保通信安全。 3.2 通常,证书文件的后缀包括.pem(秘钥文件)、.crt(证书文件)、...

    OpensslCA.doc

    2. **CA 证书和私钥**:如果 CA 服务器是独立的,你可以使用 OpenSSL 的 `req` 指令生成一个签名的根证书作为 CA 证书。如果是二级 CA,则需向上级 CA 发送证书请求,并由上级 CA 签发。 3. **证书数据库**:可以...

    OpenSSL生成的ssl证书

    注意,虽然自签发证书对于测试和内部使用是足够的,但对于生产环境,建议使用权威证书颁发机构(CA)签发的证书,以提供更高的信任度和浏览器兼容性。在实际操作中,还需要关注证书更新、过期监控以及安全最佳实践。

    用openssl软件包生成CA

    ### 使用OpenSSL软件包生成证书颁发机构(CA) 在网络安全领域中,证书颁发机构(Certificate Authority,简称CA)扮演着非常重要的角色。它不仅能够验证并确保数字证书的有效性,还能帮助用户建立对网络通信的信任。...

    Rockey Linux下OpenSSL制作自签名CA证书应用

    ### Rocky Linux下OpenSSL制作自签名CA证书应用 在当今高度数字化的世界中,网络安全变得尤为重要。其中,证书的使用是确保网络通信安全的关键之一。本文将详细介绍如何在Rocky Linux环境下利用OpenSSL工具来生成自...

    openssl生成证书

    - 生成的自签名证书通常只适用于测试环境,生产环境中应由权威的证书颁发机构(CA)签发证书。 - 证书的生命周期管理,包括定期更新和撤销,对网络安全至关重要。 - SSL/TLS协议的安全配置,如启用强密码算法、禁用...

    openssl创建ca 公私密钥 证书

    在IT行业中,加密和安全通信是至关重要的环节,OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现工具包,同时也包含了用于创建数字证书、管理CA(证书颁发机构)以及处理公钥基础设施(PKI)的相关工具。...

    Linux下使用openssl制作CA及证书颁发[参考].pdf

    Linux 下使用 OpenSSL 制作 CA 及证书颁发 Linux 下使用 OpenSSL 制作 CA 及证书颁发是一个重要的知识点,在软件开发领域中尤其重要。本文将指导读者如何使用 OpenSSL 在 Linux 平台上创建一个简单的证书颁发机构...

    openssl生成的多级CAdemo

    在多级CA结构中,通常有一个根CA,它是最顶级的、自我签发的CA,然后是中间CA,它们由根CA签发,最后是终端实体证书,如服务器或用户证书,由中间CA签发。 在本示例中,我们有三级CA:根CA、一级中间CA和二级中间CA...

    安装openssl和openssl-develd 的依赖包

    注意,实际生产环境中,通常会使用权威CA签发的证书,而不是自签名证书,因为浏览器可能会警告用户自签名证书的安全风险。 总的来说,openssl和openssl-devel在IT安全领域扮演着核心角色,是搭建安全网络服务不可或...

    openSSL生成证书以及在tomcat下的配置

    生成CA证书后,我们可以使用CA证书签发服务器端证书。使用openSSL命令签发服务器端证书: `openssl ca -in server.csr -out server.crt` 这将生成一个名为`server.crt`的服务器端证书文件,该文件包含了服务器的...

    Linux平台openssl工具生成CA证书的命令 配置文件 证书

    CA证书是由受信任的证书颁发机构(如上述的CA)签发的,它验证了其他证书的真实性。在服务器与客户端进行安全通信(如HTTPS)时,服务器会提供其由CA签名的证书,以确保数据传输的保密性和完整性。 OpenSSL是一个...

    基于OpenSSL的PKI环境设计(CA模块)

    中级CA的证书由根CA签发,同样需要生成密钥对并进行签名。 5. **配置CA** 使用`openssl.cnf`配置文件,可以定制CA的行为,包括证书有效期、签名算法、以及证书扩展等。这个配置文件对于CA的管理和签发证书至关重要...

Global site tag (gtag.js) - Google Analytics