天天看点

基于OpenSSL自建CA和颁发SSL证书1. 颁发证书2. 使用ssl证书3 关于证书申请

openssl是一个开源程序的套件、这个套件有三个部分组成:一是<code>libcryto</code>,这是一个具有通用功能的加密库,里面实现了众多的加密库;二是<code>libssl</code>,这个是实现ssl机制的,它是用于实现tls/ssl的功能;三是openssl,是个多功能命令行工具,它可以实现加密解密,甚至还可以当ca来用,可以让你创建证书、吊销证书。

默认情况ubuntu和centos上都已安装好openssl。centos 6.x 上有关ssl证书的目录结构:

ca要给别人颁发证书,首先自己得有一个作为根证书,我们得在一切工作之前修改好ca的配置文件、序列号、索引等等。

<code>vi /etc/pki/tls/openssl.cnf</code>:

一定要注意<code>[ policy_match ]</code>中的设定的匹配规则,是有可能因为证书使用的工具不一样,导致即使设置了csr中看起来有相同的countryname,stateorprovincename等,但在最终生成证书时依然报错:

<code>touch index.txt serial</code>:

在ca目录下创建两个初始文件:

为了安全起见,修改cakey.pem私钥文件权限为600或400,也可以使用子shell生成<code>( umask 077; openssl genrsa -out private/cakey.pem 2048 )</code>,下面不再重复。

使用req命令生成自签证书:

会提示输入一些内容,因为是私有的,所以可以随便输入(之前修改的openssl.cnf会在这里呈现),最好记住能与后面保持一致。上面的自签证书<code>cacert.pem</code>应该生成在<code>/etc/pki/ca</code>下。

以上都是在ca服务器上做的操作,而且只需进行一次,现在转到nginx服务器上执行:

这里测试的时候ca中心与要申请证书的服务器是同一个。

同样会提示输入一些内容,其它随便,除了<code>commone name</code>一定要是你要授予证书的服务器域名或主机名,challenge password不填。

接下来要把上一步生成的证书请求csr文件,发到ca服务器上,在ca上执行:

上面签发过程其实默认使用了<code>-cert cacert.pem -keyfile cakey.pem</code>,这两个文件就是前两步生成的位于<code>/etc/pki/ca</code>下的根密钥和根证书。将生成的crt证书发回nginx服务器使用。

到此我们已经拥有了建立ssl安全连接所需要的所有文件,并且服务器的crt和key都位于配置的目录下,剩下的是如何使用证书的问题。

浏览器作为客户端去访问https加密的服务器,一般不用去手动做其他设置,如<code>https://www.google.com.hk</code>,这是因为chrome、firefox、safari、ie等浏览器已经内置了大部分常用的ca的根证书,但自建ca的根证书就不再浏览器的信任列表中,访问时会提示如下:

ie浏览器

基于OpenSSL自建CA和颁发SSL证书1. 颁发证书2. 使用ssl证书3 关于证书申请

谷歌浏览器

基于OpenSSL自建CA和颁发SSL证书1. 颁发证书2. 使用ssl证书3 关于证书申请

安装网站证书后(同时也有信任的根证书),地址栏一般会显示绿色小锁

基于OpenSSL自建CA和颁发SSL证书1. 颁发证书2. 使用ssl证书3 关于证书申请

证书信息

基于OpenSSL自建CA和颁发SSL证书1. 颁发证书2. 使用ssl证书3 关于证书申请

这一步不是必须的,一般出现在开发测试环境中,而且具体的应用程序应该提供添加证书的方法。

<code>curl</code>工具可以在linux上模拟发送请求,但当它去访问https加密网站时就会提示如下信息:

提示上面的信息说明curl在linux的证书信任集里没有找到根证书,你可以使用<code>curl --insecure</code>来不验证证书的可靠性,这只能保证数据是加密传输的但无法保证对方是我们要访问的服务。使用<code>curl --cacert cacert.pem</code>可以手动指定根证书路径。我们也可以把根证书添加到系统(centos 5,6)默认的bundle:

在nginx配置文件(可能是<code>/etc/nginx/sites-available/default</code>)的server指令下添加:

同时注意 server_name 与证书申请时的 common name 要相同,打开443端口。当然关于web服务器加密还有其他配置内容,如只对部分url加密,对url重定向实现强制https访问,请参考其他资料。

注意,如果对于一般的应用,管理员只需生成“证书请求”(后缀大多为.csr),它包含你的名字和公钥,然后把这份请求交给诸如verisign等有ca服务公司(当然,连同几百美金),你的证书请求经验证后,ca用它的私钥签名,形成正式的证书发还给你。管理员再在web server上导入这个证书就行了。如果你不想花那笔钱,或者想了解一下原理,可以自己做ca。从ca的角度讲,你需要ca的私钥和公钥。从想要证书的服务器角度将,需要把服务器的证书请求交给ca。

如果你要自己做ca,别忘了客户端需要导入ca的证书(ca的证书是自签名的,导入它意味着你“信任”这个ca签署的证书)。而商业ca的一般不用,因为它们已经内置在你的浏览器中了。