linux升级openssl和php_openssl模块

一、OpenSSL源码升级

2014年4月8日,XP宣布正式停止服务的日子,也是OpenSSL爆出大漏洞的日子。

OpenSSL主要是负责在一些敏感的数据提交上面被广泛使用,不乏大家经常访问的一些网站:支付宝、微信、淘宝、网银、社交、门户等知名网站。

官方上面推荐大家将OpenSSL升级到OpenSSL 1.0.1g

这不火急火燎的加入的升级大军,先查看下自己机器上的OpenSSL版本。

openssl version
#OpenSSL 1.0.0-fips 29 Mar 2010

很明显不是官方所说的版本,必须要升级好吧,我们以源码的形式。先去下载相对应的OpenSSL版本。

cd /usr/local/src/
wget http://www.openssl.org/source/openssl-1.0.1g.tar.gz
tar -zxvf openssl-1.0.1g.tar.gz
cd  openssl-1.0.1g
./config shared zlib
make && make install

#修改历史的OpenSSL文件设置备份
mv /usr/bin/openssl /usr/bin/openssl.old
mv /usr/include/openssl /usr/include/openssl.old

#设置软连接使其使用新的OpenSSL版本 刚刚安装的OpenSSL默认安装在/usr/local/ssl
ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/ssl/include/openssl /usr/include/openssl

#更新动态链接库数据
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
ldconfig -v

我们再来看看OpenSSL版本信息.

openssl version

#OpenSSL 1.0.1g 7 Apr 2014

如果是1.0.1g,说明你安装正确了。

二、php_openssl组件版本更新

1、与php一同设置的编译参数情况

如果你和我一样很久很久以前安装了php的版本,而且又是在编译php版本的时候直接使用“–with-openssl”的话,似乎也没有添加什么路径的话,那么你现在可能需要重新再编译你的php版本了,首先我们要获取到当时编译php的参数,注意你的php源码版本要一致哦,当然你可以重新升级你的php版本也无妨(如果你选择升级php版本可能会导致你安装的一些组件无法使用,或者在启动php-fpm时候会有错误提示,我还是不太建议大家升级php版本,最好是找当前版本一直的源码进行重新编译)。

#查看php版本
/usr/local/php/bin/php -v

#获取php编译时的参数
/usr/local/php/bin/php -i | grep Command

#./configure'  '--prefix=/usr/local/php' '--with-mysql' '--with-mysqli' '--with-iconv-dir' '--with-zlib' '--with-libxml-dir' '--enable-xml' '--with-curl' '--enable-fpm' '--enable-mbstring' '--with-gd' '--with-openssl' '--with-mhash' '--enable-sockets' '--with-xmlrpc' '--enable-zip' '--enable-soap' '--disable-fileinfo'

注意把这些“’”都去掉,因为我们采用了源码升级OpenSSL的方式,所以新的OpenSSL安装路径在上面提到了

cd /usr/local/src/php-5.5.6

./configure  --prefix=/usr/local/php --with-mysql --with-mysqli --with-iconv-dir --with-zlib --with-libxml-dir --enable-xml --with-curl --enable-fpm --enable-mbstring --with-gd --with-openssl=/usr/local/ssl/ --with-mhash --enable-sockets --with-xmlrpc --enable-zip --enable-soap --disable-fileinfo

make && make install

你采用的是和之前源码安装一样的版本库无非就是重新编译一次需要点时间,其他都不需要修改就可以安装对openssl的升级了。我们重启下php-fpm服务。

service php-fpm restart

然后我们去phpinfo()函数输出里面去找找openssl的版本是否是OpenSSL 1.0.1g,是的话就证明一切操作都顺利了。
到这里或许你可能会说我为什么不用phpize了,这不是有点累死人的节奏,我是尝试过了,一开始就对php_openssl进行单独模块编译,编译好了之后,重新去启动php-fpm告诉我下面这个提示。

PHP Warning: Module 'openssl' already loaded in Unknown on line 0 ……

也就是说OpenSSL已经被加载了请不要重复加载,可是我将php.ini文件仔细查看也没有重复添加openssl组件,我的猜想应该是在php编译的时候配置了,所以你使用phpize添加进去的模块当然是重复的模块了。

2、未启用php_openssl模块

貌似这种情况有点差强人意的感觉,因为你从来没有使用过openssl,何必要升级呢?除非你有新的业务需要。咳咳,扯淡了。
如果你没有上面第一种情况的话,那么这种方式应该是你的最佳方式了。

cd /usr/local/src/php-5.5.6/ext/openssl

/usr/local/php/bin/phpize

./configure --with-openssl=/usr/local/ssl/ --with-php-config=/usr/local/php/bin/php-config

make && make install

最后就在/usr/local/php/lib/php.ini文件中添加一行

extension=openssl.so

重启php-fpm,去phpinfo()找找openssl的版本看看。

openssl_php_update

nginx配置多个https

之前写过一篇关于apache的多https配置文章,你可以点这里查看。

今天来说一个关于nginx的多https虚拟主机的配置,配置文件非常简单和这里的http配置差不多的,我就以这篇文章作为基础来搭建基于nginx的多https虚拟主机。

关于怎么生成证书请看这里或者可以在线生成ssl的csr在这里

为了不浪费大家的阅读时间,我就直接将我的配置文件贴上来给大家参考《i.markdream.conf》

#301跳转  将80请求全部转发到https
server {
        listen       80;
        server_name  i.markdream.com;

        location / {
            rewrite (.*) https://i.markdream.com$1 permanent;
        }
}

server {
        listen       443 ssl;
        server_name  i.markdream.com;

        root /home/vhost/i.markdream.com;

        ssl on;
		#这是你的证书目录
        ssl_certificate /usr/loacl/nginx/ssl-crt/i.markdream.crt;
		#这是你的证书key目录
        ssl_certificate_key /usr/loacl/nginx/ssl-crt/i.markdream.key;

        location / {
            index  index.html index.htm index.php;
        }

		#anythings for you...
}

重要的我已经在配置文件中详细注明了,请注意按照你的实际需要进行配置就能找到你的证书了。效果就是不管使用N个https每个域名都能找到它所对应的ssl证书(也就是实现单台IP实现对应多证书的要求),好请观看令人愉悦的demo。

 

demo演示1:https://i.markdream.com

demo演示2:https://svn.markdream.com

2015年05月08日更新

有时候我们可能既需要http能访问,https也能访问,那么我们可以这么配置conf文件

server {
        listen 80;
        listen 443 ssl;
        server_name  api.markdream.com;

        ssl_certificate /path/to/ssl/api.crt;
        ssl_certificate_key /path/to/ssl/api.key;

        root /path/to/api;
}

demo演示3:HTTP:http://api.markdream.com/jquery.min.js  HTTPS:https://api.markdream.com/jquery.min.js

好了,你现在可以实际操作下。

 

 

Apache配置虚拟主机和多HTTPS服务

之前写过一篇是讲apache配置虚拟主机的文章:http://www.markdream.com/server/apache-vhost.shtml

多个虚拟主机的配置还是教程看上文,最近闲来无事,研究了一下apache的多虚拟主机的同时添加多个https的服务

事实上apache在配置虚拟主机的时候,我们配置httpd-vhosts.conf这个文件(我已经将注释去除掉了,如果你的apache版本在2.2.x以上你大可放心的覆盖,也可以运行,不过你需要修改下hosts文件)

 

NameVirtualHost *:80

<VirtualHost abc.com:80>
    DocumentRoot "D:\abc"
    ServerName abc.com
    <Directory "D:\abc>
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost xyz.com:80>
    DocumentRoot "D:\xyz"
    ServerName xyz.com
    <Directory "D:\xyz>
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost jx.com:80>
    DocumentRoot "D:\jx"
    ServerName jx.com
    <Directory "D:\jx>
        AllowOverride All
        Order Allow,Deny
        Allow from all
    </Directory>
</VirtualHost>

一般的配置也可以可以达到目的了,服务器上面我们大可不必修改hosts文件,只需要将ServerName改成你的域名就成,当然你的域名必须做好解析到本台服务器上。

 

好了,虚拟主机的配置过程是十分简单的,下来再看如何配置多个https服务。

首先请确保你下载的apache是支持openssl的,如果没有那么就不要往下看了。(点我下载apache

我们修改httpd.conf文件中的ssl设置项搜索这两行,请一行一行的搜

 

#LoadModule ssl_module modules/mod_ssl.so

#Include conf/extra/httpd-ssl.conf

将前面的“#”号删除掉。OK保存

 

下面我们再来生成证书,这里的教程我是以windows操作系统来演示的。

1、运行cmd,进入httpd的bin目录

 

cd C:\Program Files\Apache Software Foundation\Apache2.2\bin

2、如果你安装apache有openssl的话 那么在这个bin目录下会有一个openssl.exe的文件,我们来生成证书

 

 

set openssl_conf=./openssl.cnf
openssl genrsa 2048 -des3 > server.key

openssl req -new -key server.key > server.csr

在第二步需要设置相关参数,下面我列出来

Country Name (2 letter code) [AU]:CN #国家代码 建议CN
State or Province Name (full name) [Some-State]:GUANGXI #所在省份
Locality Name (eg, city) []:NANNING #城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:YOURCOMP #你的公司名
Organizational Unit Name (eg, section) []:HELLO #组织或机构
Common Name (e.g. server FQDN or YOUR name) []:abc.com #申请证书的域名 重要
Email Address []:admin@abc.com #管理员邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456 #交换密钥
An optional company name []:abc.com #和你申请的域名一致就行了

再生成证书

 

#生成证书的有效期
openssl req -x509 -days 365 -key server.key -in server.csr > server.crt

你再看bin目录下面是不是有这三个文件了

 

crt

如果有了,OK我们的证书生成完毕。现在就开始配置https了,进入conf/extra文件夹中,找到一个httpd-ssl.conf的文件用文本工具打开它

 

Listen 443
#需要加上这段虚拟主机
NameVirtualHost *:443

AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl

SSLPassPhraseDialog  builtin

#请注意修改你的apache安装路径对应的log
SSLSessionCache        "shmcb:C:/Program Files/Apache Software Foundation/Apache2.2/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300

SSLMutex default

#去除原来的*:443
<VirtualHost xyz.com:443>
 DocumentRoot "d:/xyz_ssl"
    ServerName xyz.com:443
    SSLEngine on
	#最关键就是这里,我们上面生成的证书在这里就用到了,注意路径是否能够找到你的证书
	#我这里有两个https所以为了方便你会看到这里是另外一个证书 xyz.com的证书
	SSLCertificateFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/xyz_cret/server.crt"
	SSLCertificateKeyFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/xyz_cret/server.key"

    <Directory "d:/xyz_ssl">
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost abc.com:443>
 DocumentRoot "d:/abc_ssl"
    ServerName abc.com:443

    SSLEngine on
	#我这里有两个https所以为了方便你会看到这里是另外一个证书 abc.com的证书
	SSLCertificateFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/abc_cret/server.crt"
	SSLCertificateKeyFile "C:/Program Files/Apache Software Foundation/Apache2.2/conf/abc_cret/server.key"

    <Directory "d:/abc_ssl">
        Options -Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

 

我已经把注释都删掉了,如果不出什么意外的话,将你的证书路径找对就可以运行,请注意上面的中文注释!!!

好了,重启apache服务,我们来看下效果。

 

crt1

 

OK,重在爱好,动手勤思考。