杏彩基于Nginx服务器和iOS9的HTTPS安全通信

作者:杏彩彩票app下载

基于Nginx服务器和iOS9的HTTPS安全通信

即使是非对称加密系统,也不能保证公钥的分发是可靠的. 为了防范公钥分发过程中的中间人攻击,需要一个可信的"始祖"公证人,这就是CA机构存在的意义.

简介

在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一般是使用一个变化的参数,例如RSA加密的时间戳,但考虑到网络传输时延,时间戳需要有一定的误差容限,这样仍然不能从根本上防止重放攻击。想要较好的解决重放攻击问题,应考虑使用HTTPS通信,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

由CA签发证书认证网站的过程

  1. CA机构生成密钥对: 公钥 ca.cer 和 私钥 ca.key
  2. 浏览器/操作系统携带证书ca.cer
  3. 网站生成私钥 cert.key
  4. 网站将公钥及网站信息(域名/组织等),提交给CA机构
  5. CA机构使用私钥ca.key签发网站证书cert.cer
  6. 网站运营商通过cert.key和 cert.cer运行https
  7. 用户访问网站,获得cert.cer,由于该证书使用CA机构的私钥签发,因此可以通过保存在本地的公钥ca.cer验证
  8. 验证通过并得到了公钥-> 显示绿色https标志; 否则,提示用户风险信息
  9. 用户通过公钥与网站服务器交换对称加密密钥,进行正式的SSL会话

通过上述步骤可以看出,只要能保证网站公钥的可靠性即可,所以如果客户端直接存放了网站的证书,那么也是可以保证https正常进行的.
但是无论是何种证书,都需要可靠的分发到客户端才能保证安全.在开发过程中我们可能有各种各样的服务端,相较于为每一个服务端向客户端分发证书,还不如直接分发根证书,这样只需一次分发,客户端就可以完成后续的签发过程.

实现

对于用浏览器访问的网站,需要向CA申请证书才能保证HTTPS的网页被正常的浏览,否则会被警告是不安全或者未认证的网站,而对于一些后台数据的传输,使用自签署的证书即可。

自认证CA根证书生成及签发

证书生成过程可以通过openssl完成.为了简化操作,我写了一个shell脚本,只需两步即可生成根证书及使用根证书签发网站证书
保存以下代码为gen_crt.sh,然后按照帮助内容使用即可.

  1. 生成根证书
    ./gen_crt.sh root aes128 2048 365 "/CN=MyCA"

    此时目录下有ca.key及ca.cer两个文件,ca.cer需要发布到客户端
    为了保证私钥的安全,生成过程中需要一个对ca.key加密的密码

  2. 签发网站证书
    ./gen_crt.sh sign aes128 2048 365 "/CN=www.mysite.com" ca.key ca.cer

为了保证私钥的安全,生成过程中需要一个对cert.key加密的密码.

    #!/bin/sh

    help()
    {
        echo "Example: ./gen_crt.sh root aes128 2048 365 "/CN=CustomCA""
        echo "Example: ./gen_crt.sh sign aes128 2048 365 "/CN=www.mysite.com" ca.key ca.cer"
        echo "key_length: 1024|2048|4096"
        methods="aes128|aes192|aes256|camellia128|camellia192|camellia256|des|des3|idea"
        echo "Supported encryption methods:" $methods
        exit 1
    }

    operation=$1
    method=$2
    key_length=$3
    expire_days=$4
    subj=$5
    ca_key=$6
    ca_cer=$7

    RED="33[0;31m"
    GREEN="33[0;32m"
    NC="33[0m"


    if [ "$operation" = "root" ];then
        if [ $# -ne 5 ];then
            echo "${RED}Invalid argument num:$#${NC}"
            help
        fi
    elif [ "$operation" = "sign" ];then
        if [ $# -ne 7 ];then
            echo "${RED}Invalid argument num:$#${NC}"
            help
        fi
    else
        echo "${RED}Invalid operation $operation${NC}"
        help
    fi

    echo "Operation" $operation

    case $method in
        aes128|aes192|aes256|camellia128|camellia192|camellia256|des|des3|idea)
            echo "Using cryption method:" $method
            ;;
        *)
            echo "Wrong parameters"
            help
            ;;
    esac

    case $key_length in
        1024|2048|4096)
            echo "RSA Key length:" $key_length
            ;;
        *)
            echo "Wrong RSA key length"
            help
            ;;
    esac

    if [$expire_days -lt 0]; then
        echo "Invalid expire days:" $expire_days
        help
    fi

    if [ "$operation" = "root" ];then
        echo "Creating Root CA..."
        openssl genrsa -$method -out ca.key $key_length
        openssl req -x509 -new -key ca.key -out ca.cer -days 750 -subj $subj
        echo "${GREEN}Please distribute ca.cer anywhere needed"
        echo "${RED}Please keep ca.key in a private place${NC}"
    elif [ "$operation" = "sign" ];then
        openssl genrsa -$method -out cert.key $key_length
        openssl req -new -out cert.req -key cert.key -subj $subj
        openssl x509 -req -in cert.req -out cert.cer -CAkey $ca_key -CA $ca_cer -days $expire_days -CAcreateserial
        -CAserial serial
        echo "${GREEN}Please distribute cert.cer freely"
        echo "${RED}Please keep cert.key privately${NC}"
    else
        echo "Unknown operation: $operation"
        help
    fi

服务端的配置

生成证书
在服务器的命令行下进行如下操作
①生成服务端的私钥,需要输入一个4~8191位的密码

openssl genrsa -des3 -out server.key 2048

②去除key文件的密码,这里需要输入①中填写的密码

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

③生成csr文件,这一步要求输入多种信息,可以全部按回车跳过

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

④生成crt文件,这一步中的-days后为有效期,可以写长一点

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

⑤合并crt与key制作pem,用于后面生成cer以供客户端验证

cat server.crt server.key > server.pem

⑥用pem生成cer,cer文件存放在客户端用于验证

openssl x509 -in server.pem -outform der -out server.cer

修改nginx配置文件
如果不知道配置文件的路径,使用下面的命令来打印。

nginx -t

这个命令可以用来测试配置文件是否正确,同时也会打印出路径。

根据打印的内容,打开nginx.conf,可以发现其中有一个http { … } 配置标签,在http标签中添加一个server配置标签。

server {
listen       443;
server_name  localhost;

# 配置网站的根目录和首页的文件名和类型

index index.html index.htm index.php;
root  <这里填写网站的根目录>
ssl                  on;
ssl_certificate      <这里填写crt文件server.crt的全路径>
ssl_certificate_key  <这里填写私钥key文件server.key的全路径>

# 下面是对php的配置,如果不配置,将无法正常解析php文件,这段配置是从nginx对HTTP的80端口配置中复制过来的,如果这段配置不能正常工作,请从自己的服务器对80端口的配置文件中复制过来。

location ~ .*.(php|php5)?$
{
    #fastcgi_pass  unix:/tmp/php-cgi.sock;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi.conf;
}
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
    expires 30d;
}
location ~ .*.(js|css)?$
{
    expires 1h;
}

# 这里如果不知道如何填写,请参考80端口的配置文件

include /rewrite/default.conf;
access_log  /default.log;
}

更新配置

nginx -t #测试配置文件是否正确
nginx -s reload #重新加载配置文件

到这里,服务端的配置就结束了。

在nginx中使用证书

修改nginx配置文件 /etc/nginx/sites-available/xxxx
加入形如以下配置:

listen 443 ssl default_server;
listen [::]:443 ssl default_server;

ssl_certificate /home/ethan/workspace/homesite/tools/cert.cer;
ssl_certificate_key /home/ethan/workspace/homesite/tools/cert.key;

客户端的配置

如果是CA颁发的证书,直接使用HTTPS请求即可,但我们是自签署证书,如果直接访问会报错,下面介绍一下使用AFN来配置自签署证书的HTTPS请求的方法。

将上文提到的cer证书导入到App的Bundle中
杏彩 1

在使用AFN进行请求前,先进行如下配置< 喎?" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:java;"> AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey]; policy.allowInvalidCertificates = YES; AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.securityPolicy = policy; // 下面使用manager进行HTTPS请求即可。

简介 在网络通信中,使用抓包软件可以对网络请求进行分析,并进行重放攻击,重放攻击的解决方案一...

分发CA根证书

本文由杏彩发布,转载请注明来源

关键词: