利用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接口 用途 ...
随机推荐
- 解决Spring Boot 使用RedisTemplate 存储键值出现乱码 \xac\xed\x00\x05t\x00
spring-data-redis的RedisTemplate<K, V>模板类在操作redis时默认使用JdkSerializationRedisSerializer来进行序列化解决方法 ...
- Linux阿里云挂载磁盘,并开机自动挂载
Linux下磁盘挂载 公司新订购阿里云ECS,需要挂载当前的磁盘.暂时没有运维,自己动手挂载磁盘. 具体步骤如下: 1.查看是否已经分配 [root@iZ2ze1tefvghtbgkdur3xfZ / ...
- Bootstrap 遮罩层实现方式
直接上代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...
- hive 集成 hbase NoClassDefFoundError: org/apache/htrace/Trace
更新了hive版本后,在创建hive外部表 级联hbase 的时候报如下异常: hive (default)> create external table weblogs(id string,d ...
- Goland 提示 :configuration is still incorrect 的解决
安装好 Goland 后,调试编译的时候提示 goland configuration is still incorrect,百度 和 Google 都没有明确答案 Google 上有一些提示,但是也 ...
- UI相关
前端 UI 框架 https://github.com/twbs/bootstrap https://github.com/google/material-design-lite https://gi ...
- js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面
js 利用 ajax 加载 js ,显示加载进度 ,严格按照js的顺序先后加载到页面 , 做手机端开发时,发现一个问题,有些浏览器,在网速比较慢的情况下,js文件没有加载完,后续的调用已经开始调用了, ...
- 浅谈static其一之不死变量
在学习汇编的过程中,小有所悟,遂把自己所思所想记下,以便日后查阅. 首先说说我对这个关键字的理解.static字面上就是静止的.静态的.不变的之类的意思,所以在被它修饰之后,应该也会带有这样的一些特点 ...
- 代码之间-论文修改助手v1.0版本发布
论文查重,是每个毕业生都要面临的一个令人头疼的问题,如果写论文不认真,很可能导致查重红一大片. 之前有帮助一些朋友修改论文降低重复率,做了一些工作后发现,国内的查重机构,如知网.维普等,大多数是基于关 ...
- JS中的DOM— —节点以及操作
DOM操作在JS中可以说是非常常见了吧,很多网页的小功能的实现,比如一些元素的增删操作等都可以用JS来实现.那么在DOM中我们需要知道些什么才能完成一些功能的实现呢?今天这篇文章就先简单的带大家入一下 ...