HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。

Nginx希望服务器与客户端之间传输内容是加密的,防止中间监听泄露信息,但是去证书服务商申请证书又不合算,所以自己给自己颁发证书,忽略掉浏览器的不信任警报即可。

CentOS系统默认情况下ssl模块并未被安装,如果要使用该模块则需要在编译时指定–with-http_ssl_module参数,安装模块依赖于OpenSSL库和一些引用文件

首先确保机器上安装了openssl和openssl-devel

#yum -y install openssl
#yum -y install openssl-devel

然后就是自己颁发证书给自己

#cd /usr/local/nginx/conf
#openssl genrsa -des3 -out server.key 2048               // 生成私钥证书
#openssl req -new -key server.key -out server.csr        
#openssl rsa -in server.key -out server_nopwd.key        // 解密后的私钥
#openssl x509 -req -days 3650 -in server.csr -signkey server_nopwd.key -out server.crt      // 私钥签名

至此证书已经生成完毕,下面就是配置nginx

server {
    server_name mimvp.com;
    listen 443;
    ssl on;
    ssl_certificate  /usr/local/nginx/conf/server.crt;            // 私钥签名; 相对路径也可以
    ssl_certificate_key  /usr/local/nginx/conf/server_nopwd.key;  // 私钥文件; 相对路径也可以
}

然后重启nginx

/etc/init.d/nginx restart

错误与解决

如果出现“[emerg] 10464#0: unknown directive "ssl" in /usr/local/nginx-0.6.32/conf/nginx.conf:74”则说明没有将ssl模块编译进nginx,在configure的时候加上“--with-http_ssl_module”即可^^

至此已经完成了https服务器搭建,但如何让浏览器信任自己颁发的证书呢?

今天终于研究捣鼓出来了,只要将之前生成的server.crt文件导入到系统的证书管理器就行了,具体方法:

控制面板 -> Internet选项 -> 内容 -> 发行者 -> 受信任的根证书颁发机构 -> 导入 -》选择 server.crt

 

实战操作推荐

1. 生成证书

可以通过以下步骤生成一个简单的证书:


首先,进入你想创建证书和私钥的目录,例如:

$ cd /usr/local/nginx/conf/

创建服务器私钥,命令会让你输入一个口令:

$ openssl genrsa -des3 -out server.key 2048

创建签名请求的证书(CSR):

$ openssl  req  -new  -key server.key  -out  server.csr

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:

$ cp server.key server.key.org

$ openssl rsa -in server.key.org -out server.key

 

2. 配置nginx

最后标记证书使用上述私钥和CSR:

$ openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

修改Nginx配置文件,让其包含新标记的证书和私钥:

server {
    server_name proxy.mimvp.com;
    listen 443;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;
}

 

3. 重启nginx

/etc/init.d/nginx restart

这样就可以通过以下方式访问:

https://proxy.mimvp.com     (不需要添加 443 端口号)

 

另外,还可以加入如下代码,实现80端口重定向到443

server {
    listen 80;
    server_name mimvp.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}

 

 

nginx.conf 实例配置

    # HTTPS server
    server {
        listen       443 ssl;
        server_name     proxy.mimvp.com;       # 域名可以有多个,用空格隔开

        ssl_certificate      server.crt;
        ssl_certificate_key  server.key;

        ssl_session_cache    shared:SSL:5m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
#            root   html;
#            index  index.html index.htm;
            root                html/proxy_client/;
            index               index.html index.htm index.php;
            fastcgi_index       index.php;
            fastcgi_pass        127.0.0.1:9000;
            include             fastcgi.conf;

        }

        location ~ \.(php|php5)$ {
            root                html/proxy_client/;
            index               index.html index.htm index.php;
            fastcgi_index       index.php;
            fastcgi_pass        127.0.0.1:9000;
            include             fastcgi.conf;
        }

 

Nginx 启用 http2

Nginx 要启用http2,那么版本要在1.90以上,

然后先配置443端口,最后把http 80端口请求转发到443

# 设置非安全连接永久跳转到安全连接
server{
    listen 80;
    server_name mimvp.com;

    # 告诉浏览器有效期内只准用 https 访问
    add_header Strict-Transport-Security max-age=15768000;
    
    # 永久重定向到 https 站点
    return 301 https://$server_name$request_uri;
}

server {
    # 启用 https, 使用 http/2 协议, nginx 1.9.11 启用 http/2 会有bug, 已在 1.9.12 版本中修复.
    listen 443 ssl http2 fastopen=3 reuseport;
    server_name mimvp.com www.mimvp.com;

    # 告诉浏览器不要猜测mime类型
    add_header X-Content-Type-Options nosniff;

    ssl on;

    # 证书路径
    ssl_certificate 证书路径;

    # 私钥路径
    ssl_certificate_key

    # 安全链接可选的加密协议
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # 可选的加密算法,顺序很重要,越靠前的优先级越高.
    ssl_ciphers 'CHACHA20:EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES128-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA128:DHE-RSA-AES128-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA128:ECDHE-RSA-AES128-SHA384:ECDHE-RSA-AES128-SHA128:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA128:DHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA384:AES128-GCM-SHA128:AES128-SHA128:AES128-SHA128:AES128-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4;';

    # 在 SSLv3 或 TLSv1 握手过程一般使用客户端的首选算法,如果启用下面的配置,则会使用服务器端的首选算法.
    ssl_prefer_server_ciphers on;

    # 储存SSL会话的缓存类型和大小
    ssl_session_cache shared:SSL:10m;

    # 缓存有效期
    ssl_session_timeout 60m;

    location / {
        proxy_set_header 	X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   	Host      $http_host;
        proxy_set_header 	X-Forwarded-Proto $scheme;
        proxy_pass         	http://127.0.0.1:9000;
    }
}

 

 

参考推荐

Mac OS X 安装 Nginx

https 免费证书申请与安装 (推荐

https SSL 免费证书服务申请 (推荐

httpd使用ssl模块配置HTTPS

Mac 安装Nginx with-http_ssl_module

LNMP(linux+nginx+mysql+php)服务器环境配置

CentOS安装Nginx (推荐