作者:烨竹
HTTP的认证方式
BASIC 认证(基本认证)
DIGEST 认证(摘要认证)
SSL 客户端认证
FormBase 认证(基于表单认证)
1.基本认证(basic authentication)
--> 普通 GET 请求
<-- 401 响应码拒绝请求,携带响应头 WWW-Authenticate 描述保护区域 和 认证算法
--> 请求携带 Authorization 头,指明认证算法和用户名密码
<-- 200 相应
2.摘要认证
DIGEST认证同样使用质询/响应的方式(challenge / response),但不会像 BASIC 认证那样直接发送明文密码,但是和 HTTPS 的客户端认证相比仍旧很弱
基本认证 和 摘要认证 都是一种无状态的认证方式,就是不需要服务器端保存必要的session,所以也没有session失效期。客户端每次都需要将密码和用户名发送给服务器来完成认证,,而且用户名和密码是保存在浏览器进程的内存中的,也就是只有当浏览器关闭的时候,用户名和密码也随之删除,才表示这次服务和认证结束,下一次请求需要重新输入用户名和密码。
这两种方式都是浏览器产生输入用户名和密码的登录框。Basic认证采用了Base64编码,攻击者很容易获取http请求,然后解码请求就可以获取用户名和密码,没有安全性可言;
而Digest认证采用一中NONCE随机字符串,用户的每次认证都需要哈希和MD5(用户名和密码),并加入这个盐值,客户端和服务器端每次的NONCE都是不一样的,这样就保证了认证的安全性和不可重放性。
这里的NONCE并不是Session保存的一个字符串,这样就违背了无状态性特性
3.SSL 客户端认证
SSL 客户端认证是借由 HTTPS 的客户端证书完成认证的方式。凭借客户端证书(详见 HTTPS加密机制以及数字证书)认证,服务器可确认访问是否来自已登陆的客户端。
SSL 客户端认证步骤:
为达到 SSL 客户端认证的目的,需要事先将客户端证书分发给客户端,且客户端必须安装此证书。
- 接收到需要认证资源的请求,服务器会发送 Certificate Request 报文,要求客户端提供客户端证书。
- 用户选择将发送的客户端证书后,客户端会把客户端证书信息以 Client Certificate 报文方式发送给服务器。
- 服务器验证客户端证书,验证通过后方可领取证书内客户端的公开密钥,然后开始 HTTPS 加密通信。
4.表单认证
基于表单的认证方法并不是在 HTTP 协议中定义的,客户端会向服务器上 Web 应用发送登录信息,按登录信息的验证结果认证。
Https
1.RSA:对极大整数做因数分解的难度决定了RSA算法的可靠性
非对称加密算法
乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
甲方获取乙方的公钥,然后用它对信息加密。
乙方得到加密后的信息,用私钥解密。
公钥可以解密私钥加密的数据,私有也可以解密公钥加密的数据
在线测试 公钥/私钥 的 加密/解密
在线生成密钥对
在线 RSA 公钥加密解密
在线 RSA 私钥加密解密
Read More
阮一峰的网络日志 RSA算法原理(一)
阮一峰的网络日志 RSA算法原理(二)
2.SSL握手
生成对话密钥一共需要三个随机数
握手之后的对话使用"对话密钥"加密(对称加密),服务器的公钥和私钥只用于加密和解密"对话密钥"(非对称加密),无其他作用
服务器公钥放在服务器的数字证书之中
Read More
SSL/TLS协议运行机制的概述
图解SSL/TLS协议
3.证书申请
术语
CA : 电子商务认证授权机构(Certificate Authority)
CSR : 证书签名请求(Certificate Signing Request) 是签发证书时的重要材料,它可以保证私钥安全的情况下通过远端CA签发证书。
CRT : 证书文件(Certificate [sərˈtɪfɪkət] )
制作 CSR 文件
在申请数字证书之前,必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),
CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单位信息,需要提交给CA认证中心。
在生成CSR文件时会同时生成私钥文件,需妥善保管和备份
生成CSR文件时,一般需要输入以下信息(中文需要UTF8编码):
Organization Name(O)
:申请单位名称法定名称,可以是中文或英文
Organization Unit(OU)
:申请单位的所在部门,可以是中文或英文
Country Code(C)
:申请单位所属国家,只能是两个字母的国家码,如中国只能是:CN
State or Province(S)
:申请单位所在省名或州名,可以是中文或英文
Locality(L)
:申请单位所在城市名,可以是中文或英文
Common Name(CN)
:申请SSL证书的具体网站域名
使用 OpenSSL 制作
# -new 指定生成一个新的CSR
# -out certificate.csr 输出文件为 当前目录下 ca.kail.xyz.csr
# - newkey rsa:2048 指定私钥类型和长度
# - nodes指定私钥文件不被加密
# -keyout 生成私钥输出文件为 当前目录下 ca.kail.xyz.key
$ openssl req -new -out ca.kail.xyz.csr -newkey rsa:2048 -nodes -keyout ca.kail.xyz.key
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanghai
Locality Name (eg, city) [Default City]:shanghai
Organization Name (eg, company) [Default Company Ltd]:kail
Organizational Unit Name (eg, section) []:kail-ca
Common Name (eg, your name or your server's hostname) []:ca.kail.xyz
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
显示 csr 文件内容
openssl req -in ca.kail.xyz.csr -text
使用 Java keytool 工具制作
使用 Keytool 工具生成 jks(Java Key Store) 文件
jks 是一个密码保护的文件,存放私钥和证书
# -keyalg 指定密钥类型,必须是 RSA
# -alias 指定证书别名,可自定义
# -keysize 指定密钥长度为 2048
# -keystore 指定证书文件保存路径
keytool -genkey -alias ca.kail.xyz -keyalg RSA -keysize 2048 -keystore ./ca.kail.xyz.jks
输入命令后会有下面的交互式操作:
输入密钥库口令:
再次输入新口令:
您的名字与姓氏是什么?
[Unknown]: ca.kail.xyz
您的组织单位名称是什么?
[Unknown]: dev
您的组织名称是什么?
[Unknown]: kail
您所在的城市或区域名称是什么?
[Unknown]: Shanghai
您所在的省/市/自治区名称是什么?
[Unknown]: Shanghai
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=ca.kail.xyz, OU=dev, O=kail, L=Shanghai, ST=Shanghai, C=CN是否正确?
[否]: Y
输入 <ca.kail.xyz> 的密钥口令
(如果和密钥库口令相同, 按回车):
通过 jks 文件生成证书请求
# sigalg指定摘要算法,使用 SHA256withRSA。
# alias指定别名,必须与 keystore 文件中的证书别名一致。
# keystore指定证书文件。
# file指定证书请求文件(CSR)。
keytool -certreq -sigalg SHA256withRSA -alias ca.kail.xyz -keystore ./ca.kail.xyz.jks -file ./ca.kail.xyz.csr
从 jks 文件 获取 私钥
- 将 JKS 格式证书转换成 PFX 格式
keytool -importkeystore -srckeystore ./ca.kail.xyz.jks -destkeystore ./ca.kail.xyz.pfx -srcstoretype JKS -deststoretype PKCS12
- PFX 文件转成 pem 文件
openssl pkcs12 -in ca.kail.xyz.pfx -nodes -out ca.kail.xyz.pem
- pem 文件 中提取出私钥
openssl rsa -in ca.kail.xyz.pem -out ca.kail.xyz.key
主流数字证书都有哪些格式? 介绍了各种格式之间的转换
自制证书:
keytool
上面 “从 jks 文件 获取 私钥”中的 第2步,生成的 ca.kail.xyz.pem 文件, 里面包含 私钥和证书信息,编辑删除多余的部分 保留
-----BEGIN CERTIFICATE-----
和-----END CERTIFICATE-----
中间的内容,后缀名改为.csr
即可。
Windows 下 双击打开,可查看证书内容。
OpenSSL
openssl x509 -req -days 365 -in ca.kail.xyz.csr -signkey ca.kail.xyz.key -out ca.kail.xyz.crt
申请授信证书
通过 SSL.md 免费获取
参见 快速获取免费SSL证书
X509 文件扩展名
DER、PEM、CRT和CER这些扩展名经常令人困惑。很多人错误地认为这些扩展名可以互相代替。
尽管的确有时候有些扩展名是可以互换的,但是最好你能确定证书是如何编码的,进而正确地标识它们。正确地标识证书有助于证书的管理。
编码 (也用于扩展名)
.DER
扩展名DER用于二进制DER编码的证书。比较合适的说法是 “我有一个DER编码的证书”,而不是“我有一个DER证书”。
.PEM
扩展名PEM用于ASCII(Base64)编码的各种X.509 v3 证书。文件开始由一行"—– BEGIN …“开始。
常用的扩展名
.CRT
扩展名CRT用于证书。证书可以是DER编码,也可以是PEM编码。扩展名CER和CRT几乎是同义词。这种情况在各种unix/linux系统中很常见。
.CER
CRT证书的微软型式。可以用微软的工具把CRT文件转换为CER文件(CRT和CER必须是相同编码的,DER或者PEM)。
扩展名为CER的文件可以被IE识别并作为命令调用微软的cryptoAPI(具体点就是rudll32.exe cryptext.dll, CyrptExtOpenCER),进而弹出一个对话框来导入并/或查看证书内容。
.KEY
扩展名KEY用于PCSK#8
的公钥和私钥。这些公钥和私钥可以是DER编码或者PEM编码。
CRT文件和CER文件只有在使用相同编码的时候才可以安全地相互替代。
Read More
如何制作CSR文件?
阿里云证书服务
快速获取免费SSL证书
https://ssl.md
Let's Encrypt,免费好用的 HTTPS 证书
acme.sh 自动更新证书
4.Nginx 配置 HTTPS
证书文件获取:参见 [证书申请]
判断 Nginx 有没有启动 SSL 模块
nginx -V
查看
configure arguments
中 如果有with-http_ssl_module
则表明开启了 SSL 模块。
安装时 启用 SSL 模块
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_gzip_static_module --with-http_ssl_module --with-openssl=/usr/local/openssl-1.1.0g
make && make install
nginx.conf
nginx/conf
文件夹下新建文件夹 cert
, 放入 ca.kail.xyz.crt
证书文件 和 ca.kail.xyz.key
私钥
server {
listen 443 ssl;
server_name ca.kail.xyz;
ssl_certificate cert/ca.kail.xyz.crt;
ssl_certificate_key cert/ca.kail.xyz.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
autoindex on;
}
}
强制 HTTPS
server {
listen 80;
server_name ca.kail.xyz;
rewrite ^(.*) https://$server_name$1 permanent;
}
Read More
CentOS 7.4 实例配置 Nginx + HTTPS 服务
nginx使用ssl模块配置HTTPS支持
nginx配置ssl加密(单/双向认证、部分https)