利用openssl管理证书及SSL编程第1部分: openssl证书管理
利用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证书管理的更多相关文章
- 利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl
利用openssl管理证书及SSL编程第2部分:在Windows上编译 openssl 首先mingw的环境搭建,务必遵循下文: http://blog.csdn.net/ubuntu64fan/ar ...
- 利用openssl管理证书及SSL编程第3部分:将MinGW编译的openssl dll导出def和lib供MSVC使用
将MinGW编译的openssl dll导出def和lib供MSVC使用 前面我们用mingw把openssl 编译成了动态库,得到下面2个dll文件: libeay32.dll ssleay32.d ...
- [转帖] ./demoCA/newcerts: No such file or directory openssl 生成证书时问题的解决.
接上面一篇blog 发现openssl 生成server.crt 时有问题. 找了一个网站处理了一下: http://blog.sina.com.cn/s/blog_49f8dc400100tznt. ...
- 基于X.509证书和SSL协议的身份认证过程实现(OpenSSL可以自己产生证书,有TCP通过SSL进行实际安全通讯的实际编程代码)good
上周帮一个童鞋做一个数字认证的实验,要求是编程实现一个基于X.509证书认证的过程,唉!可怜我那点薄弱的计算机网络安全的知识啊!只得恶补一下了. 首先来看看什么是X.509.所谓X.509其实是一种非 ...
- openssl建立证书,非常详细配置ssl+apache
原文链接:http://blog.51yip.com/apachenginx/958.html openssl建立证书,非常详细配置ssl+apache 张映 发表于 2010-08-07 分类目录: ...
- 利用keytool、openssl生成证书文件
转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...
- Security基础(三):OpenSSL及证书服务、邮件TLS/SSL加密通信
一.OpenSSL及证书服务 目标: 本案例要求熟悉OpenSSL工具的基本使用,完成以下任务操作: 使用OpenSSL加密/解密文件 搭建企业自有的CA服务器,为颁发数字证书提供基础环境 方案: 使 ...
- 如何利用OpenSSL生成证书
此文已由作者赵斌授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.前言 最近为了测试内容分发网络(Content Delivery Network,简称 CDN)添加的新功 ...
- 使用 openssl 生成证书
一.openssl 简介 目前最流行的 SSL 密码库工具官网:https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 ...
随机推荐
- 关于npm run build 报错解决方案
# 特定的错误 ERROR in statics/mobile/js/vendor.cef13a0e680a5bc0d8b3.js from UglifyJsUnexpected token: pun ...
- Leetcode Scratching Recorder
Author: Zhong-Liang Xiang Start from: August 7th, 2017 这个题为连滚带爬的Leetcode填坑记录就这么开始了. 网上看了看, 一堆小伙从2014 ...
- __str__与__repr__
在讲解之前,我们先来了解下str和repr的区别:两者都是用来将数字,列表等类型的数据转化为字符串的形式.不同之处在于str更加类似于C语言中使用printf输出的内容,而repr输出的内容会直接将变 ...
- AIX 命令
1,[ctrl]+h 删除命令 2, set -o emacs后: [ctrl]+p 看上条命令 [ctrl]+n 看下条命令 两次[esc] 自动补全 3, set -o vi 后,可以按照vi编辑 ...
- Django项目实战之用户头像上传与访问
1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> < ...
- Node.js 调试器
稳定性: 3 - 稳定 V8 提供了强大的调试工具,可以通过 TCP protocol 从外部访问.Node 内置这个调试工具客户端.要使用这个调试器,以debug参数启动 Node,出现提示: % ...
- 让你的代码量减少3倍!使用kotlin开发Android(四) kotlin bean背后的秘密
上一篇我们介绍了缩短五倍的java bean,不知道你在看的时候有没有一种疑问捏? 本文同步自博主的私人博客wing的地方酒馆 再来回顾一下,两种代码的对比 public class User { p ...
- Android 实现串口的移植
安卓串口的实现,需要底层C++配合,不过这次我们根据framework中的思想,直接用API修改提供给JAVA层调用,这个就比较简单了. DEV项目需要,要实现在Android中实现串口的收发功能,有 ...
- [CSDN_Markdown]Markdown基本语法2
简介 前文 Markdown基本语法 中介绍了Markdown的基本语法,知道那些基本的语法,实际上已经可以写纯文本的博客了.对我们这群写代码的人或者将要写代码的人来说,貌似这些还不够,我们还希望能插 ...
- 给pdf文件添加防伪水印logo(附工程源码下载)
pdf添加水印logo这种需求场景确实很少,有些时候一些销售单据生成pdf添加一个水印logo,做一个简单的防伪效果,虽然实际上并没有太大作用,但是产品经理说要,巴拉巴拉--省略一万字. 下面将源码分 ...