zoukankan      html  css  js  c++  java
  • 给Nginx配置一个自签名的SSL证书

    要保证Web浏览器到服务器的安全连接,HTTPS几乎是唯一选择。HTTPS其实就是HTTP over SSL,也就是让HTTP连接建立在SSL安全连接之上。

    SSL使用证书来创建安全连接。有两种验证模式:

    1. 仅客户端验证服务器的证书,客户端自己不提供证书;

    2. 客户端和服务器都互相验证对方的证书。

    显然第二种方式安全性更高,一般用网上银行会这么搞,但是,普通的Web网站只能采用第一种方式。

    客户端如何验证服务器的证书呢?服务器自己的证书必须经过某“权威”证书的签名,而这个“权威”证书又可能经过更权威的证书签名,这么一级一级追溯上去,最顶层那个最权威的证书就称为根证书。根证书直接内置在浏览器中,这样,浏览器就可以利用自己自带的根证书去验证某个服务器的证书是否有效。

    如果要提供一个有效的证书,服务器的证书必须从VeriSign这样的证书颁发机构签名,这样,浏览器就可以验证通过,否则,浏览器给出一个证书无效的警告。

    申请一个证书签名的费用是一年几十~几百刀不等,所以如果只是出于管理目的,可以创建自签名证书,保证管理员通过浏览器安全连接到服务器。

    下面简单介绍如何创建一个自签名的SSL证书。

    创建自签名证书需要安装openssl,使用以下步骤:

    1. 创建Key;

    2. 创建签名请求;

    3. 将Key的口令移除;

    4. 用Key签名证书。

    为HTTPS准备的证书需要注意,创建的签名请求的CN必须与域名完全一致,否则无法通过浏览器验证。

    以上步骤命令繁琐,所以我做了一个shell脚本,能一次性把证书搞定。从这里下载脚本:

    https://github.com/michaelliao/itranswarp.js/blob/master/conf/ssl/gencert.sh

    #!/bin/sh
    
    # create self-signed server certificate:
    
    read -p "Enter your domain [www.example.com]: " DOMAIN
    
    echo "Create server key..."
    
    openssl genrsa -des3 -out $DOMAIN.key 1024
    
    echo "Create server certificate signing request..."
    
    SUBJECT="/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
    
    openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr
    
    echo "Remove password..."
    
    mv $DOMAIN.key $DOMAIN.origin.key
    openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
    
    echo "Sign SSL certificate..."
    
    openssl x509 -req -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt
    
    echo "TODO:"
    echo "Copy $DOMAIN.crt to /etc/nginx/ssl/$DOMAIN.crt"
    echo "Copy $DOMAIN.key to /etc/nginx/ssl/$DOMAIN.key"
    echo "Add configuration in nginx:"
    echo "server {"
    echo "    ..."
    echo "    listen 443 ssl;"
    echo "    ssl_certificate     /etc/nginx/ssl/$DOMAIN.crt;"
    echo "    ssl_certificate_key /etc/nginx/ssl/$DOMAIN.key;"
    echo "}"
    gencert.sh

    运行脚本,假设你的域名是www.test.com,那么按照提示输入:

    $ ./gencert.sh 
    Enter your domain [www.example.com]: www.test.com          
    Create server key...
    Generating RSA private key, 1024 bit long modulus
    .................++++++
    .....++++++
    e is 65537 (0x10001)
    Enter pass phrase for www.test.com.key:输入口令
    Verifying - Enter pass phrase for www.test.com.key:输入口令
    Create server certificate signing request...
    Enter pass phrase for www.test.com.key:输入口令
    Remove password...
    Enter pass phrase for www.test.com.origin.key:输入口令
    writing RSA key
    Sign SSL certificate...
    Signature ok
    subject=/C=US/ST=Mars/L=iTranswarp/O=iTranswarp/OU=iTranswarp/CN=www.test.com
    Getting Private key
    TODO:
    Copy www.test.com.crt to /etc/nginx/ssl/www.test.com.crt
    Copy www.test.com.key to /etc/nginx/ssl/www.test.com.key
    Add configuration in nginx:
    server {
        ...
        ssl on;
        ssl_certificate     /etc/nginx/ssl/www.test.com.crt;
        ssl_certificate_key /etc/nginx/ssl/www.test.com.key;
    }

    红色部分是输入,注意4次输入的口令都是一样的。

    在当前目录下会创建出4个文件:

    • www.test.com.crt:自签名的证书
    • www.test.com.csr:证书的请求
    • www.test.com.key:不带口令的Key
    • www.test.com.origin.key:带口令的Key

    Web服务器需要把www.test.com.crt发给浏览器验证,然后用www.test.com.key解密浏览器发送的数据,剩下两个文件不需要上传到Web服务器上。

    以Nginx为例,需要在server {...}中配置:

    server {
        ...
        ssl on;
        ssl_certificate     /etc/nginx/ssl/www.test.com.crt;
        ssl_certificate_key /etc/nginx/ssl/www.test.com.key;
    }

    如果一切顺利,打开浏览器,就可以通过HTTPS访问网站。第一次访问时会出现警告(因为我们的自签名证书不被浏览器信任),把证书通过浏览器导入到系统(Windows使用IE导入,Mac使用Safari导入)并设置为“受信任”,以后该电脑访问网站就可以安全地连接Web服务器了:

    如何在应用服务器中配置证书呢?例如Tomcat,gunicorn等。正确的做法是不配置,让Nginx处理HTTPS,然后通过proxy以HTTP连接后端的应用服务器,相当于利用Nginx作为HTTPS到HTTP的安全代理,这样即利用了Nginx的HTTP/HTTPS处理能力,又避免了应用服务器不擅长HTTPS的缺点。

    相关推荐:建议使用 http://www.startssl.com/ 该网站提供1年免费的证书,可以在证书到期前2周内再去网站上renew一下。

    相关链接:http://www.liaoxuefeng.com/article/0014189023237367e8d42829de24b6eaf893ca47df4fb5e000

  • 相关阅读:
    npm 引入第三方过滤器
    登录加密 md5
    JavaScript 日期处理类库 moment
    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。
    js 常见的小数取整问题
    vue 路由跳转到外部链接
    js some和filter用法和区别
    前端调用后端接口返回200(成功状态码),后端有返回,但是控制台Network Response为空,没展示任何信息
    二叉树的镜像
    树的子结构
  • 原文地址:https://www.cnblogs.com/yhdsir/p/5141933.html
Copyright © 2011-2022 走看看