修改日期 | 修改人 | 备注 |
2021-10-12 13:48:46[当前版本] | 潘帅 | 1.1 |
2021-10-12 12:19:52 | 潘帅 | 1.0 |
linux环境下使用系统自带的OpenSSL生成自签名SSL证书,支持多个域名及IP地址,适合内网或无域名的情况。
#生成私钥(RSA加密算法、2048位加密、输出文件名rf_dev.key) openssl genrsa -out rf_dev.key 2048 #移除私钥中的密码 openssl rsa -in rf_dev.key -out rf_dev.key #生成证书(配置文件路径san_dev.cnf、扩展信息项req_ext、有效期720天) openssl req -new -key rf_dev.key -out rf_dev.csr -config san_dev.cnf -extensions req_ext -days 720 #签发证书 openssl x509 -req -sha256 -in rf_dev.csr -signkey rf_dev.key -extfile san_dev.cnf -extensions req_ext -out rf_dev.crt -days 720 #生成服务器格式证书 openssl pkcs12 -inkey rf_dev.key -in rf_dev.crt -export -out rf_dev.pfx -name rf_dev
最大的好处就是免费并且支持IP地址绑定,适合内部局域网和开发环境,可以根据自己的需要随意创建自签名证书,证书信息和有效期都可以不受限制。商用SSL证书肯定是可以相信的,防护能力越强的SSL证书价格也是越贵的,大部分服务商都提供了免费SSL证书的申请,但都需要绑定域名。
自签名证书的弊端确实不少,主要集中在安全性上。由于是自签名的,想怎么改就怎么改,没有限制,就有很大的安全隐患。Chrome浏览器从某个特定版本之后就不再支持自签名证书了,使用上会造成不小的影响。自签名证书的有效期可以设置很长的时间,5年10年都可以,只要有人有心花足够的时间就可以将其破解,而商用SSL证书的有效期一般1到2年,降低了破解的概率。此外之前OpenSSL还爆出多个漏洞,比较有名的就是HeartBleed(心脏流血)漏洞。听这名字就感觉很严重,攻击者可以利用这个漏洞获取大量用户信息,事实上也造成了很大的影响。虽然这个漏洞在后续版本中被修复,但自签名证书的安全隐患依然存在。
此外,国内许多安全测评认证机构对于自签名证书的使用仍持保留态度,如果你的项目可能会面临等级保护测评、国家密码测评、信息安全测评等,还是要慎重考虑。
总的来说,使用自签名证书要根据实际需求,如果你的应用是面向互联网提供服务的,还是尽量不用自签名证书了。自己在内部网络或者开发环境做测试使用自签名证书倒是不错的选择。
安装完SSL证书后,发现一连串的问题接踵而至,这就涉及到HTTP与HTTPS的相互调用了。
HTTP访问HTTP当然没有问题,HTTPS访问HTTPS也没问题,HTTP访问HTTPS还是没有问题,最麻烦的就是HTTPS访问HTTP了。
如果SSL证书是在业务应用上线之后才添加的,通知客户修改原有的访问地址显然不太现实,那么就可以将原有的HTTP地址重定向至新的HTTPS地址。大部分Web服务器都提供了这个功能,以Nginx为例:
server { listen 80; server_name my.domain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name my.domain.com; [....] }注意:SSL证书默认绑定443端口,但并不是只能绑定443端口,其他端口也能用,就好像Web应用默认绑定的是80端口但不是只能绑定80端口一样。
理论上HTTPS直接访问HTTP请求就会有错误提示,所以只能想办法解决,可以把被访问的HTTP也改成HTTPS,也可以使用反向代理访问HTTP(曲线救国),常用的解决方式有这么几种:
server { location /httpresource { proxy_pass http://cdn.staticfile.org/; } }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapRazorPages(); }); }
"DangerousAcceptAnyServerCertificateValidator": true