利用openssl管理证书及SSL编程第1部分

参考:

1) 利用openssl创建一个简单的CA

http://www.cppblog.com/flyonok/archive/2010/10/30/131840.html

2) Win32平台下OpenSSL编写SSL,TLS程序

http://www.cppblog.com/flyonok/archive/2011/03/24/133100.html

cheungmine

2015-12-15

1. 利用openssl管理证书

CA(Certification Authority),简称CA证书。CA 也拥有一个证书(内含公钥
和私钥)。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得
到 CA 的证书(含公钥),用以验证它所签发的证书。如果用户想得到一份属于
自己的证书,他应先向 CA 提出申请。在 CA判明申请者的身份后,便为他分配
一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便
形成证书发给申请者。

如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字
进行验证,一旦验证通过,该证书就被认为是有效的。证书实际是由证书签证机
关(CA)签发的对用户的公钥的认证。

证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字
和有效期等等。目前,证书的格式和验证方法普遍遵循X.509 国际标准。

CA一般指证书授权机构,比如VeriSign, Startssl。浏览器内嵌了这些公司的公钥
证书,这样用户使用由这些公司颁发出来的证书就得到了浏览器的信任,不会提示
用户安全问题。

也可以认为CA是得到了浏览器厂商认证的授权证书颁发机构,谁都可以成为CA,但
要想得到浏览器厂商认证是非常难的。如果得到了浏览器厂商认证的CA,其颁发的
证书都会被浏览器检查通过放行,否则浏览器要提示用户有证书需要安装,让用户
自己承担风险,这些提示常常被认为是不愉快的(比如12306.cn)。

如果接受了(无论提示与否),浏览器就安装了这个证书,于是访问网站就在一个
安全的隧道中进行,这个隧道称为 SSL(Secure Sockets Layer 安全套接层)及
其继任者传输层安全(Transport Layer Security,TLS)。

用商业的CA证书,都是要花钱的,而且不便宜。除非用自己的证书,就涉及到浏览
器接受的问题。免费的startssl可以解决一部分问题,烦人的是需要1年1签。

假定我们可以接受这个浏览器提示,或者我们根本就是在写一个ssl程序,那么自
己做CA完全没问题。自己做老大的感觉很爽。下面就让我们利用开源openssl软件,
在Linux(或UNIX/Cygwin)下创建一个简单的CA。我们可以利用这个CA进行PKI、
数字证书相关的测试。比如,在测试用Tomcat或Apache构建HTTPS双向认证时,我
们可以利用自己建立的测试CA来为服务器端颁发服务器数字证书,为客户端(浏
览器)生成文件形式的数字证书(可以同时利用openssl生成客户端私钥)。

1.1 创建CA

假定我的CA公司叫做pepstack,我的网站叫pepstack.com(这是我个人使用的域名),
我想建立自己的CA,并且给自己的网站颁发证书,给使用我的网站的用户颁发客户
端证书。下面开始创建我的CA。(用户可以把pepstack换成你公司的名字)

该简单的CA将建立在用户自己的目录下($HOME/pepstack),无需超级用户(root)
权限。

1) 创建CA需要用到的目录和文件:

执行命令如下:

mkdir -p $HOME/ca.pepstack.com/{newcerts,private,conf}
chmod g-rwx,o-rwx $HOME/ca.pepstack.com/private
echo "01" > $HOME/ca.pepstack.com/serial
touch $HOME/ca.pepstack.com/index.txt

说明:
  $HOME/ca.pepstack.com 为待建CA的主目录(以下简称CA_HOME)。
  newcerts 目录将存放CA签署(颁发)过的数字证书(证书备份目录)。
  private 目录用于存放CA的私钥(pepstackcakey.pem)。
  conf 目录用于存放一些简化参数用的配置文件。
  文件serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库。

1.2 生成CA的私钥和自签名证书(即根证书)

1) 创建配置文件:

$HOME/ca.pepstack.com/conf/genpepstackca.conf

内容如下:

[req]
default_keyfile=$ENV::HOME/ca.pepstack.com/private/pepstackcakey.pem
default_md=md5
prompt=no
distinguished_name=ca_distinguished_name
x509_extensions=ca_extensions

[ca_distinguished_name]
organizationName=pepstack.com
organizationalUnitName=ca.pepstack.com
commonName=pepstackca
emailAddress=master@pepstack.com

[ca_extensions]
basicConstraints=CA:true

2) 然后在CA_HOME目录下执行命令:

$ openssl req -x509 -newkey rsa:2048 -out pepstackcacert.pem -outform PEM -days 3650 \
  -config $HOME/ca.pepstack.com/conf/genpepstackca.conf

执行过程中需要输入CA私钥的保护密码(万万不可泄露),假设我们输入密码:123456

可以用如下命令查看一下CA自己证书的内容
  $ openssl x509 -in pepstackcacert.pem -text -noout

3) 创建一个配置文件,以便后续CA日常操作中使用

$HOME/ca.pepstack.com/conf/pepstackca.conf
内容如下:

[ca]
# The default ca section
default_ca=pepstackca

[pepstackca]
# top dir
dir=$ENV::HOME/ca.pepstack.com

# index file
database=$dir/index.txt

# new certs dir
new_certs_dir=$dir/newcerts

# The CA cert
certificate=$dir/pepstackcacert.pem

# serial no file
serial=$dir/serial

# CA private key
private_key=$dir/private/pepstackcakey.pem

# random number file
RANDFILE=$dir/private/.rand

# how long to certify for
default_days=365

# how long before next CRL
default_crl_days=30

# message digest method to use
default_md=md5

# Set to 'no' to allow creation of several ctificates with same subject
unique_subject=no

# default policy
policy=policy_any

[policy_any]
countryName=optional
stateOrProvinceName=optional
localityName=optional
organizationName=optional
organizationalUnitName=optional
commonName=supplied
emailAddress=optional

2. CA签发数字证书

现在我们已经是CA了,如果我们的根证书(公钥)能被浏览器厂商接受,嵌入到
比如火狐浏览器中,那么我们就可以给某个网站(如a.com)签发证书,当用户
用火狐访问https://a.com的时候,ssl(tls)就起作用了,a.com可以信任访问它
的用户,而用户也能信任a.com网站。往来信息被加密。

2.1 创建一个证书请求

a.com要建立https的网站,于是请求我们给他们签发一个证书,首先要创建一个证书请求:

$ mkdir $HOME/ca.pepstack.com/newcerts/a.com && cd $HOME/ca.pepstack.com/newcerts/a.com

$ openssl req -newkey rsa:1024 -keyout acomkey.pem -keyform PEM -out acomreq.pem -outform PEM \
-subj "/O=a.com/OU=ou.a.com/CN=a.com"

执行过程中需要输入私钥的保护密码,假设输入密码: 888888

执行完后,acomkey.pem即为a.com的密钥,而acomreq.pem即为证书请求。
可以查看证书请求的内容:
  $ openssl req -in acomreq.pem -text -noout

2.2 pepstack CA为a.com签发证书

$ openssl ca -in acomreq.pem -out acomcert.pem \
  -config $HOME/ca.pepstack.com/conf/pepstackca.conf

执行过程中需要输入CA的密钥保护密码(刚才设置的123456),并且最后询问
是否要给该用户签发证书时要选y。

执行完后,acomcert.pem 即为证书,用命令查看证书内容:
  $ openssl x509 -in acomcert.pem -text -noout

2.3 制作一个PKCS12格式的文档(个人数字证书)

本节“个人数字证书”意为包含私钥和证书的实体,而不是单指只保护公钥的数字证书。

我们制作的这个PKCS#12文件将包含密钥、证书和颁发该证书的CA证书。该证书文件
可以直接用于服务器数字证书或个人数字证书。把前几步生成的密钥和证书制作成
一个pkcs12文件acomcert.p12的方法执行命令:

$ openssl pkcs12 -export -in acomcert.pem -inkey acomkey.pem \
  -out acom.p12 -name a.com \
  -chain -CAfile $HOME/ca.pepstack.com/pepstackcacert.pem

执行过程中需要输入保护a.com密钥的密码(888888),以及新的保护pkcs12文件
的密码: 222222

执行完后,acom.p12即为pkcs12文件。你可以直接拷贝到windows下,作为个人
数字证书,双击导入IE后就可以使用了(输入密码222222)。该文件也可以直接用于
tomcat作为服务器证书使用。

若要查看acom.p12的内容可以用命令:
  $ openssl pkcs12 -in acom.p12
Enter Import Password: 222222

3 CA的日常操作

3.1. 根据证书申请请求签发证书

假设收到一个证书请求文件名为req.pem,文件格式应该是PKCS#10格式

(标准证书请求格式)。

首先可以查看一下证书请求的内容,执行命令:
  $ openssl req -in req.pem -text -noout

将看到证书请求的内容,包括请求者唯一的名字(DN)、公钥信息(可能还有一
组扩展的可选属性)。

执行签发命令:
  $ openssl ca -in req.pem -out cert.pem -config $HOME/ca.pepstack.com/conf/pepstackca.conf

执行过程中会要求输入访问CA的私钥密码(刚才设置的123456)。

完成上一步后,签发好的证书就是cert.pem,另外$HOME/ca.pepstack.com/newcerts
里也会有一个相同的证书副本(文件名为证书序列号, 如: 01.pem)。

你可以执行以下语句来查看生成的证书的内容:
  $ openssl x509 -in cert.pem -text -noout

3.2. 吊销证书(作废证书)

一般由于用户私钥泄露等情况才需要吊销一个未过期的证书。
(当然我们用本测试CA时其时很少用到该命令,除非专门用于测试吊销证书的情况)

假设需要被吊销的证书文件为cert.pem,则执行以下命令吊销证书:
  $ openssl ca -revoke cert.pem -config $HOME/ca.pepstack.com/conf/pepstackca.conf

3.3. 生成证书吊销列表文件(CRL)

准备公开被吊销的证书列表时,可以生成证书吊销列表(CRL),执行命令如下:
  $ openssl ca -gencrl -out pepstackca.crl -config $HOME/ca.pepstack.com/conf/pepstackca.conf

还可以添加-crldays和-crlhours参数来说明下一个吊销列表将在多少天后(或多少小时候)发布。

可以用以下命令检查pepstackca.crl的内容:
  $ openssl crl -in pepstackca.crl -text -noout

利用openssl管理证书及SSL编程第1部分: openssl证书管理的更多相关文章

  1. 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl

    利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...

  2. 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用

    将MinGW编译的openssl dll导出def和lib供MSVC使用 前面我们用mingw把openssl 编译成了动态库,得到下面2个dll文件: libeay32.dll ssleay32.d ...

  3. [转帖] ./demoCA/newcerts: No such file or directory openssl 生成证书时问题的解决.

    接上面一篇blog 发现openssl 生成server.crt 时有问题. 找了一个网站处理了一下: http://blog.sina.com.cn/s/blog_49f8dc400100tznt. ...

  4. 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good

    上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...

  5. openssl建立证书,非常详细配置ssl+apache

    原文链接:http://blog.51yip.com/apachenginx/958.html openssl建立证书,非常详细配置ssl+apache 张映 发表于 2010-08-07 分类目录: ...

  6. 利用keytool、openssl生成证书文件

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...

  7. Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信

    一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使 ...

  8. 如何利用OpenSSL生成证书

    此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.前言 最近为了测试内容分发网络(Content Delivery Network,简称 CDN)添加的新功 ...

  9. 使用 openssl 生成证书

    一.openssl 简介 目前最流行的 SSL 密码库工具官网:https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 ...

随机推荐

  1. 解决Spring Boot 使用RedisTemplate 存储键值出现乱码 \xac\xed\x00\x05t\x00

    spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化解决方法 ...

  2. Linux阿里云挂载磁盘,并开机自动挂载

    Linux下磁盘挂载 公司新订购阿里云ECS,需要挂载当前的磁盘.暂时没有运维,自己动手挂载磁盘. 具体步骤如下: 1.查看是否已经分配 [root@iZ2ze1tefvghtbgkdur3xfZ / ...

  3. Bootstrap 遮罩层实现方式

    直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...

  4. hive 集成 hbase NoClassDefFoundError: org/apache/htrace/Trace

    更新了hive版本后,在创建hive外部表 级联hbase 的时候报如下异常: hive (default)> create external table weblogs(id string,d ...

  5. Goland 提示 :configuration is still incorrect 的解决

    安装好 Goland 后,调试编译的时候提示 goland configuration is still incorrect,百度 和 Google 都没有明确答案 Google 上有一些提示,但是也 ...

  6. UI相关

    前端 UI 框架 https://github.com/twbs/bootstrap https://github.com/google/material-design-lite https://gi ...

  7. js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面

    js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面 , 做手机端开发时,发现一个问题,有些浏览器,在网速比较慢的情况下,js文件没有加载完,后续的调用已经开始调用了, ...

  8. 浅谈static其一之不死变量

    在学习汇编的过程中,小有所悟,遂把自己所思所想记下,以便日后查阅. 首先说说我对这个关键字的理解.static字面上就是静止的.静态的.不变的之类的意思,所以在被它修饰之后,应该也会带有这样的一些特点 ...

  9. 代码之间-论文修改助手v1.0版本发布

    论文查重,是每个毕业生都要面临的一个令人头疼的问题,如果写论文不认真,很可能导致查重红一大片. 之前有帮助一些朋友修改论文降低重复率,做了一些工作后发现,国内的查重机构,如知网.维普等,大多数是基于关 ...

  10. JS中的DOM— —节点以及操作

    DOM操作在JS中可以说是非常常见了吧,很多网页的小功能的实现,比如一些元素的增删操作等都可以用JS来实现.那么在DOM中我们需要知道些什么才能完成一些功能的实现呢?今天这篇文章就先简单的带大家入一下 ...