前端项目经常需要用到 https 安全连接,为了本地开发方便,我想给 localhost 加上 ssl ,所以我用下面这条命令生成证书和密钥:
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out crt.pem
创建期间所有问题一路回车跳过。接下来还用以下 openssl 命令转换了 pem 文件:
openssl rsa -outform der -in key.pem -out my.key;
openssl x509 -outform der -in crt.pem -out my.crt;
然后我自行把 my.crt 文件导入 Windows 下 Chrome 的 设置-管理证书-受信任的根证书颁发机构 里。最后用 browser-sync 或 http-server 工具打开本地服务器并监听静态目录,访问 https://locahost:8080 依旧显示 您的连接不是私密连接 ,打开标签页证书,可以看到证书导入成功,证书状态是 该证书没有问题 。
可是证书依旧是无效的,通过大量网络搜索,确保证书的生成和导入是没问题的,但就是没办法像访问普通 https 链接那样被信任。网上甚至有些文章教怎么设置浏览器不弹出警告,我觉得这是不治本的。所以对网上所说的自定义 ssl 证书可以方便开发的可行性感到疑惑。
问题:自定义 ssl 证书给 localhost 使用,是否能达到普通 https 网站的连接效果?如果是,请问该如何操作?
期望:自建 ssl 证书并打开本地服务器,使得 https://locahost:8080 能像普通 https 站点一样,被 Windows 的 Chrome 和 macOS 的 Safari 浏览器信任并正常访问。
PS:我这个问题被人踩了一下,系统提示我的问题“没有实际价值,缺少关键内容,没有改进余地”,我不是经常来思否可能不是很懂社区规矩。我提问之前已经搜索过没有相似的问题,难道这不算有实际价值?我的步骤、命令和尝试也列出来了,这关键内容难道还不充分?这个问题既然是可以实现的,那就是有改进的余地吧?我不是很明白为什么会被踩一下,希望看到这段话的朋友们在评论里指正我的不足之处,下次提问我注意一下。
补充:感谢下面两位的回答,我已经成功在本地打开 https 链接了。但是现在有个新的小问题,就是我不能在局域网让其他设备也访问 https://localhost:8080,本来在证书里加上本机的 ip 地址即可,但是公司的 ip 地址是动态分配的,几乎一天一换。于是我想用 Browsersync 做代理,但是代理出来的 https://DynamicIP:8088 仍然显示不安全,这个有什么解决办法么。
问题:自定义 ssl 证书给 localhost 使用,是否能达到普通 https 网站的连接效果?如果是,请问该如何操作?
答案是:完全可以!
推荐给你个新方案:FiloSottile/mkcert,亲测更简单易用。
补充回答:
Browsersync没有接触过,不清楚。
https的ssl证书必须绑定域名,所以
https://{ip}
这种是绝对会显示不安全的。你的问题我先分拆成两个情况回答:
必须用域名访问,这是个大前提。如果其他电脑也可以导入你自己生成的证书,那么一个简单有效的办法就是同样在所有电脑上写 hosts。比如你的server为192.168.233.233:8443,签署一个域名为 myhttpsserver233 的证书,再在电脑上写上如下类似 hosts :
这样就可以使用
https://myhttpsserver233:8443
的方式访问你的服务这是一个DNS问题,核心思想为 通过一个域名访问一个IP不固定的服务器 。如果能向公司网管申请静态DHCP绑定的话,是最好不过。但如果实现不了,就得绕一个很远很远的远路。(固定DHCP没戏,内网DNS绑定就更不可能了)
一种思路是使用DDNS服务,每次你的服务器IP被改变的时候,向DNS服务器发起变更请求,让域名的解析地址转变为新IP地址。这个方法需要引用外部的DDNS服务,并且使用真实的域名,只不过绑定的IP是内网的。国内有不少服务商提供此服务(推荐pubyun,有免费服务)。
结论:
核心问题结合起来就是:必须用域名访问一个IP不固定的服务器。
思路是引入 DDNS 没跑了。
不过如果你有自己的域名(互联网可用的那种,非hosts),可以将 DDNS 的免费地址 CNAME 到你的一个二级域名下。之后直接使用 Let's encrypt 申请 泛域名证书 ,可以直接获取到受浏览器认可的SSL证书。(我在公司就是这么做的,只不过服务器都绑定了静态 DHCP 所以没有引入 DDNS)