经常给人做站,大部分时候是在本地测试,往往上线的时候需要改域名,并配置 SSL。因为本地一直用的是 http 普通协议。像做 WordPress 站,然后上线的时候,又得改数据库又得改配置的。最近是在是受不了了,直接给 WAMP 本地配置了 HTTP + SSL 环境。上线后无缝切换。百度了一下,发现。没一个详细点的教程。Forece 只能自己写一个了。

SSL 加密方式

1. 客户端向服务器发出加密请求
2. 服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
3. 客户端A确认数字证书有效性
4. 如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。

一、安装 WAMP

这步不用说了吧,搜到这篇文章的基本都安装了 WAMP 环境。

二、生成证书

安装 OpenSSL

OpenSSL 是一个开源命令行工具,用于生成 SSL 证书和秘钥。 OpenSSL 网站提供 32 位和 64 位版本。 看自己 Windows 版本情况下载,一般 WIN10 都直接64位走起。从这里下载最新版本的 OpenSSL,另外咱们只是生成个 SSL 证书,使用 Light 版本就够用了。

生成私钥

1. 我这边直接把 OpenSSL 安装在了 C:\OpenSSL-Win64 ,需要在 CMD 命令行中进入到 C:\OpenSSL-Win64\bin 文件夹

cd c:\OpenSSL-Win64\bin

2. 然后输入下方命令生成秘钥,其中会提示输入密码,随便输入个容易记的密码就好,这个密码不太重要,123456 走你。

openssl genrsa -aes256 -out private.key 2048

提示:输入的密码是不可见的,直接输入然后回车即可,然后再次输入一遍做密码验证。

根据已生成的RSA私钥输出无加密的私钥

openssl rsa -in private.key -out private.key

再次提示需要输入密码,输入刚才你键入的密码

此时私钥就生成好了,在 C:\OpenSSL-Win64\bin 文件夹下就会有个 private.key 文件生成,其实刚才已经生成了,只是我们做了一个移除密码的工作。

生成证书

还是在当前 C:\OpenSSL-Win64\bin 文件夹,再次输入命令,用来生成证书文件

openssl req -new -x509 -nodes -sha1 -key private.key -out certificate.crt -days 36500

提示需要输入一些信息,都是一些无关紧要的信息,我们只是做本地环境测试,没必要认真填写。一路回车就可以了。Common Name 那里输入 localhost 或者你的虚拟主机域名。

此时证书也生成好了,在当前文件夹下可以看到有个 certificate.crt 证书文件。

配置 WAMP SSL 环境

移动证书、私钥文件

将证书和私钥文件移动到 WAMP 的 Apache 的配置文件夹中,根据自己个人路径和 Apache 版本而定,我的是在 C:\wamp64\bin\apache\apache2.4.46\conf,创建一个 key 文件夹,然后将证书和秘钥拷贝过来。

配置 httpd.conf

用文本编辑器(Notepad++ 之类的)打开 wamp64\bin\apache\apache2.4.46\conf\httpd.conf 文件,将下边三行的注释取消(移除 # 字符)

LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

配置 httpd-ssl.conf

用文本编辑器打开 wamp64\bin\apache\apache2.4.46\conf\extra\httpd-ssl.conf 文件,搜索对应配置信息,进行修改。

DocumentRoot "${INSTALL_DIR}/www"
ServerName localhost:443
ServerAdmin admin@example.com
SSLCertificateKeyFile "${SRVROOT}/conf/key/private.key"
SSLCertificateFile "${SRVROOT}/conf/key/certificate.crt"
SSLSessionCache "shmcb:${SRVROOT}/logs/ssl_scache(512000)"
CustomLog "${SRVROOT}/logs/ssl_request.log" \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

其实此时,你的 SSL 已经配置完成了,重启 WAMP 服务,访问 https://localhost 就能正常访问了。虽然会弹出证书无效的提示(因为自己发的嘛),不过已经可以在当前环境工作了。如果你是单站点,并且修改了 host,那么在 ServerName 那边设置域名即可。如果是多站点,开启了虚拟主机,那么您借着往下看。

配置虚拟主机

如果你给自己配置了虚拟主机,支持本地多站点域名访问操作,(一般人都会这么干吧,不会的可以参考 Forece 之前写过的文章,点击这里),那么还需要对虚拟主机进行配置。

打开 wamp64\bin\apache\apache2.4.46\conf\extra\httpd-vhosts.conf

复制一份需要开启 SSL 的站点配置(如果不想80端口生效的话,直接在80端口的配置修改也可以),然后添加几条配置

<VirtualHost *:443>
  ServerName lara.net
  DocumentRoot "${INSTALL_DIR}/www/laravel/public"
  <Directory "${INSTALL_DIR}/www/laravel/public">
    Options +Indexes +Includes +FollowSymLinks +MultiViews
    AllowOverride All
    Require local
  </Directory>
  SSLEngine on
  SSLCertificateFile "${SRVROOT}/conf/key/certificate.crt"
  SSLCertificateKeyFile "${SRVROOT}/conf/key/private.key"
</VirtualHost>

重启 WAMP

最后,如果想让 SSL 生效的话,需要重启 WAMP 服务。如果图标变绿了,那么代表一切正常,直接访问站点即可。

如果图标不是绿色,而是橘色,那么代表 Apache 没能正常开启,需要在命令行模式下进入 wamp64/bin/apache/apache2.4.41/bin/ 文件夹用 httpd-t 命令来进行排查哪出错了。

踩坑

顺便说一下自己,配置了无数遍,就是无法正常启动 Apache,最后发现原来 443 端口(SSL端口)被其他程序占用了。怒改端口,然后成功开启。

- 在 SSL配置 改掉 LISTEN 端口
- 在 SSL配置 改掉 虚拟主机端口
- 在 虚拟主机配置 改掉虚拟主机端口

然后通过排查,发现原来是 VMware 占用了 443 端口,去 VMware 配置中改了端口(编辑-首选项-共享虚拟机),再把 WAMP 端口配置改回来,完美!

附:Windwos 中如何查看端口占用应用