标签归档:nginx

nginx配置ssl证书

1.简介:

HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容请看SSL。
  它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

<span style=”font-weight: bold;”–<-自行颁发不受浏览器信任的SSL证书

为晒晒IQ网颁发证书。ssh登陆到服务器上,终端输入以下命令,使用openssl生成RSA密钥及证书。
# 生成一个RSA密钥
$ openssl genrsa -des3 -out 33iq.key 1024
# 拷贝一个不需要输入密码的密钥文件
$ openssl rsa -in 33iq.key -out 33iq_nopass.key
# 生成一个证书请求
$ openssl req -new -key 33iq.key -out 33iq.csr
# 自己签发证书
$ openssl x509 -req -days 365 -in 33iq.csr -signkey 33iq.key -out 33iq.crt
第3个命令是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域名后缀的。这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件。当然我这里并没有向证书提供商申请,而是在第4步自己签发了证书。
openssl x509 -req -sha256 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650 -out server.crt
openssl x509 -req -days 365 -in 33iq.csr -signkey 33iq.key -out 33iq.crt

2.ngx_stream_ssl_module:https://cloud.tencent.com/developer/section/1259656     https://blog.lyz810.com/article/2016/06/ngx_stream_ssl_module_doc_zh-cn/

配置模板:
stream {
 ...
 server {
 listen 12345 ssl;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
 ssl_certificate /usr/local/nginx/conf/cert.pem;
 ssl_certificate_key /usr/local/nginx/conf/cert.key;
 ssl_session_cache shared:SSL:10m;
 ssl_session_timeout 10m;
 ...
 }

—ssl_certificate

语法:ssl_certificate file
默认:—
上下文:stream, server
为给定的服务器指定一个PEM格式的证书文件。如果中级证书需要指定在初级证书中,它们需要在相同的文件中按如下顺序指定:初级证书在前,然后是中级证书。PEM格式的密钥也应该放到相同文件中。
从1.11.0版本开始,该指令可以指定多次加载不同类型的证书,例如RSA和ECDSA:

—ssl_certificate_key

语法:ssl_certificate_key file
默认:—
上下文:stream, server
为给定的服务器指定一个PEM格式的密钥文件。
engine:name:id值可以代替文件指定,会从OpenSSL引擎name中加载指定id的密钥。

—ssl_ciphers

语法:ssl_ciphers ciphers
默认:ssl_ciphers HIGH:!aNULL:!MD5
上下文:stream, server
指定启用的加密算法。加密算法指定为OpenSSL库可以识别的格式,例如:
ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
完整的列表可以通过“openssl ciphers”命令查看。

—ssl_protocols

语法:ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]
默认:ssl_protocols TLSv1 TLSv1.1 TLSv1.2
上下文:stream, server
启用指定的协议。TLSv1.1和TLSv1.2参数只有OpenSSL库在1.0.1及更高版本使用时才有效。

—ssl_session_cache

语法:ssl_session_cache off | none | [builtin[:size]] [shared:name:size]
默认:ssl_session_cache none
上下文:stream, server
设置保存会话参数的缓存类型和大小。缓存可以下面任意类型:
off
使用会话缓存是强烈禁止的:nginx明确告诉客户端会话不能被重用。
none
使用会话缓存是不允许的:nginx告诉客户端会话可以重用,但实际上会话参数不会保存在缓存中。
builtin
构建在OpenSSL中的缓存,只被一个工作进程使用。缓存大小指定在会话中。如果没给出大小,它等于20480个会话,使用built-in缓存可以引起内存碎片。
shared
在工作进程之间共享的缓存。缓存大小指定为字节。1M可以保存大约4000个会话。每个共享缓存有一个唯一的名字。相同名字的缓存可以在多个服务器之间使用。
缓存和类型可以同时使用,例如:
ssl_session_cache builtin:1000 shared:SSL:10m;
但是只使用共享缓存不带built-in缓存会更有效率。

—ssl_session_timeout

语法:ssl_session_timeout time
默认:ssl_session_timeout 5m
上下文:stream, server
指定一个时间,在这个期间客户端可以重用保存在缓存中的会话参数。

2.配置nginx双向认证:https://blog.csdn.net/qq_22239675/article/details/86541088

(1)创建证书目录:mkdir /usr/local/nginx/ssl:

(2)为服务器端和客户端准备公钥、私钥:

--生成服务端私钥
openssl genrsa -out server.key 1024
--生成服务端公钥
openssl rsa -in server.key -pubout -out server.pem
--客户端私钥
openssl genrsa -out client.key 1024
--客户端公钥
openssl rsa -in client.key -pubout -out client.pem

(3)生成CA证书:

--生成 CA 私钥:
openssl genrsa -out ca.key 1024
--生成请求文件:注意,这里的 Organization Name (eg, company) [Internet Widgits Pty Ltd]: 后面生成客户端和服务器端证书的时候也需要填写,不要写成一样的!!!       Common Name (e.g. server FQDN or YOUR name) []: 这一项,是最后可以访问的域名
openssl req -new -key ca.key -out ca.csr
--生成ca证书:
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt

(4)生成服务器端证书和客户端证书:

--服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件:
openssl req -new -key server.key -out server.csr
--向自己的 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书:
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
--生成client端csr:
openssl req -new -key client.key -out client.csr
--client 端得到 CA 签名生成client端证书:
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in client.csr -out client.crt

(5)如果使用jmeter进行测试,还需要对客户端证书和私钥进行转换:https://www.cnblogs.com/cuimiemie/p/6442668.html

–keytool和openssl生成的证书相互之间无法识别,keytool生成的为jsk文件,openssl默认生成的为PEM格式文件。需要先转换成pkcs12格式,然后再使用对方的命令转换成需要的格式。

openssl pkcs12 -export -in client.crt -inkey client.key -out client.p12 -name client -passin pass:${passwd} -passout pass:${passwd}
keytool -importkeystore -srckeystore client.p12 -srcstoretype PKCS12 -srcstorepass ${passwd} -alias client -deststorepass ${passwd} -destkeypass ${passwd} -destkeystore ClientCert.jks

–jmeter配置:

–Protocols:客户端与服务器通过SSL加密通道连接时,可以选择单向或者双向认证(Dual)。双向认证时,您还需要指定相应的信任秘钥库(Trust Key Store), 客户端证书,以及对应的文件保护密码(Secret)。

–User authentication:如果服务器配置了用户认证,您需要提供相应的用户名和口令。

–ClientId prefix:标识客户端的固定前缀,每个连接(虚拟用户)再添加一个uuid串,整个作为客户标识。

–Keep alive(s):心跳信号发送间隔。例如,300表示客户端每隔300秒向服务器发出ping请求,以保持连接活跃。

–Connection keep time(s):连接建立后,保持该连接的时长。例如,1800表示1800秒之后连接将被关闭,即使一直发送心跳信号。

–Connect attempt max:第一次连接过程中,尝试重连的最大次数。超过该次数则认为连接失败。

–Reconnect attempt max:后继连接过程中,尝试重连的最大次数。超过该次数则认为连接失败。

3.nginx最后配置文件如下:

server {
        listen 1234 ssl so_keepalive=on ;
        proxy_connect_timeout 1s;
        proxy_timeout 3600s;
        proxy_pass iot1886;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate /usr/local/nginx/ssl/server.crt;
        ssl_certificate_key /usr/local/nginx/ssl/server.key;
        ssl_client_certificate /usr/local/nginx/ssl/ca.crt;
        ssl_verify_client on;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;
    }

4.涉及的一些名词介绍:https://www.cnblogs.com/UnGeek/p/6048334.html

TLS:传输层安全协议 Transport Layer Security的缩写
SSL:安全套接字层 Secure Socket Layer的缩写
TLS与SSL对于不是专业搞安全的开发人员来讲,可以认为是差不多的,这二者是并列关系,详细差异见 http://kb.cnblogs.com/page/197396/
KEY 通常指私钥。
CSR 是Certificate Signing Request的缩写,即证书签名请求,这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。
CRT 即 certificate的缩写,即证书。
X.509 是一种证书格式.对X.509证书来说,认证者总是CA或由CA指定的人,一份X.509证书是一些标准字段的集合,这些字段包含有关用户或设备及其相应公钥的信息。
X.509的证书文件,一般以.crt结尾,根据该文件的内容编码格式,可以分为以下二种格式:
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码.
Apache和*NIX服务器偏向于使用这种编码格式.
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读.
Java和Windows服务器偏向于使用这种编码格式
OpenSSL 相当于SSL的一个实现,如果把SSL规范看成OO中的接口,那么OpenSSL则认为是接口的实现。接口规范本身是安全没问题的,但是具体实现可能会有不完善的地方,比如之前的"心脏出血"漏洞,就是OpenSSL中的一个bug.

##################遇到报错:######################

(1)同样的转换命令,在服务端转换server文件时未报错,转换

[junoN1@node1 ssl]$ openssl pkcs12 -export -in client.crt -inkey client.pem -out client.p12 -name client -passin pass:${passwd} -passout pass:${passwd}
unable to load private key
139774655215504:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:707:Expecting: ANY PRIVATE KEY

(2)jmeter:报错,查看后台terminal即可:

–Response message: Publish: Connection not found.   协议文件错误,最开始使用了key和crt文件;

–unable to load SSL private key from PEM file。           还是协议文件报错,使用的server端的文件;

####

##阿里云下载免费证书:https://blog.csdn.net/baofeidyz/article/details/80435929

1.获取免费证书:https://www.cnblogs.com/grimm/p/5938496.html https://www.linuxidc.com/Linux/2011-11/47478.htm