• 使用OpenSSL生成自用证书
    时间:2013-09-07   作者:佚名   出处:互联网

    Step 1. Create key (password protected)

    openssl genrsa -out prvtkey.pem 1024/2048                     (with out password protected)  

    openssl genrsa -des3 -out prvtkey.pem 1024/2048    (password protected)

    这个命令会生成一个1024/2048位的密钥。

    Step 2. Create certification request

    openssl req -new -key prvtkey.pem -out cert.csr

    openssl req -new -nodes -key prvtkey.pem -out cert.csr

    这个命令将会生成一个证书请求,当然,用到了前面生成的密钥prvtkey.pem文件
    这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。

    Step 3: Send certificate request to Certification Authority (CA)

    如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
    openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095
    这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem


    cacert.pem 生成过程见“OpenSSL建立自己的CA”

     
    有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器


    --------------------------------------------------------------------------------


    OpenSSL建立自己的CA

    (1) 环境准备

    首先,需要准备一个目录放置CA文件,包括颁发的证书和CRL(Certificate Revoke List)。
    这里我们选择目录 /var/MyCA。

    然后我们在/var/MyCA下建立两个目录,certs用来保存我们的CA颁发的所有的证书的副本;private用来保存CA证书的私钥匙。

    除了生成钥匙,在我们的CA体系中还需要创建三个文件。第一个文件用来跟踪最后一次颁发的证书的序列号,我们把它命名为serial,初始化为01。第二个文件是一个排序数据库,用来跟踪已经颁发的证书。我们把它命名为index.txt,文件内容为空。

    $ mkdir /var/MyCA
    $ cd /var/MyCA
    $ mkdir certs private
    $ chmod g-rwx,o-rwx private
    $ echo "01" > serial
    $ touch index.txt

    第三个文件是OpenSSL的配置文件,创建起来要棘手点。示例如下:

    $ touch openssl.cnf

    文件内容如下:

    [ ca ]
    default_ca = myca

    [ myca ]
    dir = /var/MyCA
    certificate = $dir/cacert.pem
    database = $dir/index.txt
    new_certs_dir = $dir/certs
    private_key = $dir/private/cakey.pem
    serial = $dir/serial

    default_crl_days= 7
    default_days = 365
    default_md = md5

    policy = myca_policy
    x509_extensions = certificate_extensions

    [ myca_policy ]
    commonName = supplied
    stateOrProvinceName = supplied
    countryName = supplied
    emailAddress = supplied
    organizationName= supplied
    organizationalUnitName = optional

    [ certificate_extensions ]
    basicConstraints= CA:false

    我们需要告诉OpenSSL配置文件的路径,有两种方法可以达成目的:通过config命令选项;通过环境变量OPENSSL_CONF。这里我们选择环境变量的方式。

    $ OPENSSL_CONF=/var/MyCA/openssl.cnf"
    $ export OPENSSL_CONF

    (2) 生成根证书 (Root Certificate)

    我们需要一个证书来为自己颁发的证书签名,这个证书可从其他CA获取,或者是自签名的根证书。这里我们生成一个自签名的根证书。

    首先我们需要往配置文件里面添加一些信息,如下所示,节名和命令行工具的命令req一样。我们把所有必要的信息都写进配置,而不是在命令行输入,这是唯一指定X.509v3扩展的方式,也能让我们对如何创建根证书有个清晰的把握。

    [ req ]
    default_bits = 2048
    default_keyfile = /var/MyCA/private/cakey.pem
    default_md = md5
    prompt = no
    distinguished_name = root_ca_distinguished_name
    x509_extensions = root_ca_extensions
    [ root_ca_distinguished_name ]
    commonName = My Test CA
    stateOrProvinceName = HZ
    countryName = CN
    emailAddress = test@cert.com
    organizationName = Root Certification Authority
    [ root_ca_extensions ]
    basicConstraints = CA:true

    万事俱备,我们可以生成根证书了。注意设置好环境变量OPENSSL_CONF。

    $ openssl req -x509 -newkey rsa -out cacert.pem -outform PEM -days 356

    注:“-days 356“控制有效期限为365天,默认为30天。

    验证一下我们生成的文件。

    $ openssl x509 -in cacert.pem -text -noout

    (3) 给客户颁发证书

    在给客户颁发证书之前,需要客户提供证书的基本信息。我们另外开启一个终端窗口,使用默认的OpenSSL配置文件(不要让之前的OPENSSL_CONF干扰我们,那个配置是专门用来生成根证书的)。

    命令和我们生成根证书的类似,都是req,不过需要提供一些额外的信息。如下:

    $ openssl req -newkey rsa:1024 -keyout testkey.pem -keyform PEM -out testreq.pem -outform PEM

    有两次提示要口令,第一次的口令用来加密私钥匙testkey.pem,第二次口令一般被OpenSSL忽略。
    结果生成两个文件:testkey.pem,私钥匙;testreq.pem,请求信息,其中包括公钥匙。

    我们来看看testreq.pem都有哪些信息?

    $ openssl req -in testreq.pem -text -noout

    现在,我们可以把testreq.pem提交给我们的CA生成证书了。
    为了方便起见,我们假定testreq.pem在//var/MyCA/private/中。

    $ openssl ca -in testreq.pem

    有三次提示,一次是问你CA的私钥匙密码,两次是确认,输出的结果就是为客户颁发的证书。
    可以通过batch选项取消命令提示,可通过notext选项取消证书的输出显示。
    此外,还可以一次给多个客户颁发证书,方法是用 infiles选项替换in选项,不过这个选项必须放在最后,因为此后的任何字符均被处理为文件名称列表。

    生成的证书放在certs目录,同时index.txt和serial的内容都发生了改变。

    网友留言/评论

    我要留言/评论

    相关文章

    利用SSH隧道技术穿越你的企业级防火墙:SSH也就是Secure Shell的意思,通过它能在用户和主机之间建立一条安全的通道,所以就很有用。隧道只是其中一种。如果你有一台机器的SSH账号,而这台机器相对方便些,就可以用SSH从本机挖条隧道到这台机器,然后再通过这台机器去浏览WWW,还是很方便的。
    Squid,Nginx,Lighttpd反向代理的区别:反向代理从传输上分可以分为2种: 1:同步模式(apache-mod_proxy和squid) 2:异步模式(lighttpd 和 nginx)
    大型开源日志系统比较:日志对于系统的安全来说非常重要,它记录了系统每天发生的各种各样的事情,用户可以通过它来检查错误发生的原因,或者寻找受到攻击时攻击者留下的痕迹。日志主要的功能是审计和监测。它还可以实时地监测系统状态,监测和追踪侵入者。 本文将介绍几个开源系统并做比较。
    扩充分布式系统Hadoop的强大工具组合:Apache基金会规划的Hadoop体系中还有许多牛B的周边方案,如可支持SQL语法的Hive,不懂Java也能撰写MapReduce的Pig,这些都是开发者不能错过的Hadoop相关方案哦。
    Redis学习之主从复制介绍:redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。
    Redis学习之Sorted-Sets数据类型介绍:redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。本文将介绍Redis之Sorted-Sets数据类型。
    使用Memcache存储一些注意点:Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题
    浅谈Squid在图片存储架构中的应用:将近快一个月没写文章了,太懒散了,今天振作了一下,写了篇关于Squid的文章,Squid作为分布式代理缓存服务器真的非常的棒,希望本文对你有帮助。
    运维必须要知道的几个 Linux 服务器监控命令:如果你是个运维管理同学,如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个 专业的 Linux 系统管理员。
    SMTP的相关流程和命令介绍:SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。