通过https访问localhost的二级域名

我们都知道本机服务器的ip是127.0.0.1,对应的域名为localhost,在日常的开发中经常会用到这两者。特别是在用localhost调试项目的时候,因为生产环境肯定要部署https的,为了避免出现不必要的错误,可以在本地开发中也通过https访问localhost,确保环境的统一。

例如,我们为localhost生成一个指定 sha256 加密算法 RSA 2048 位密钥,有效期为10年的证书,则命令如下:

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes \

  -keyout /etc/apache2/ssl/localhost.key -out /etc/apache2/ssl/localhost.crt \

  -subj "/CN=localhost" -extensions EXT -config <( \

   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

在windwos终端命令行可以运行如下命令:

@"

[dn]

CN=localhost

[req]

distinguished_name = dn

x509_extensions = EXT

prompt = no

[EXT]

subjectAltName = DNS:localhost

keyUsage = digitalSignature

extendedKeyUsage = serverAuth

"@ | Out-File -Encoding ascii localhost.conf

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes `

  -keyout "C:/wamp/ssl/localhost.key" `

  -out "C:/wamp/ssl/localhost.crt" `

  -subj "/CN=localhost" -config localhost.conf -extensions EXT

然后,在web服务器中如apache的虚拟主机中设置如下即可:

    ServerName   localhost

    DocumentRoot "/var/www/html"

    SSLEngine on

    SSLCertificateFile /etc/apache2/ssl/localhost.crt

    SSLCertificateKeyFile /etc/apache2/ssl/localhost.key

但在实际工作中,本地肯定不止一个项目,而且都需要绑定域名,这时候怎么办呢?以往人们的习惯是通过不同的端口访问,例如localhost,localhost:8080等等。现在看来,这并不是一个好的办法。因为我们有了更好的解决方法。

其实在 IETF(Internet Engineering Task Force ) 发布的 RFC 6761 文档中定义了包括 localhost 在内的特殊用途域名。其中鲜为人知的亮点之一是,localhost 及其所有子域名(例如 blog.localhost、shop.localhost)都被保留,以便自动解析为 127.0.0.1,即您本地计算机的环回地址。无需编辑系统的 hosts 文件或设置 DNS 服务器。

而如果这些所有localhost域名都可以通过https访问,则可以通过如下命令生成证书:

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes \

  -keyout /etc/apache2/ssl/localhost.key -out /etc/apache2/ssl/localhost.crt \

  -subj "/CN=localhost" -extensions EXT -config <( \

   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost,DNS:*.localhost\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth")

如果除了localhost,*.localhost域名,连127.0.0.1也希望可以通过https访问,则可以通过如下命令生成证书:

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes \

  -keyout /etc/apache2/ssl/localhost.key -out /etc/apache2/ssl/localhost.crt \

  -subj "/CN=localhost" -extensions EXT -config <( \

   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost,DNS:*.localhost,IP:127.0.0.1\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\basicConstraints=CA:FALSE")

在windwos终端命令行可以运行如下命令:

@"

[dn]

CN=localhost

[req]

distinguished_name = dn

x509_extensions = EXT

prompt = no

[EXT]

subjectAltName = DNS:localhost,DNS:*.localhost,IP:127.0.0.1

keyUsage = digitalSignature,keyEncipherment

extendedKeyUsage = serverAuth

basicConstraints = CA:FALSE

"@ | Out-File -Encoding ascii localhost.conf

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes `

  -keyout "C:/wamp/ssl/localhost.key" `

  -out "C:/wamp/ssl/localhost.crt" `

  -subj "/CN=localhost" -config localhost.conf -extensions EXT

实际上面的命令并不能对localhost的二级域名起作用,生成的证书里显示包含*.localhost,但不知道是主机系统的原因,还是web服务器的原因,抑或是浏览器的问题,总之访问localhost二级域名时证书不能正确授信。

所以,只能在命令中直接显性写入具体的localhost的二级域名了:

@"

[dn]

CN=localhost

[req]

distinguished_name = dn

x509_extensions = EXT

prompt = no

[EXT]

subjectAltName = DNS:localhost,DNS:blog.localhost,DNS:shop.localhost,IP:127.0.0.1

keyUsage = digitalSignature,keyEncipherment

extendedKeyUsage = serverAuth

basicConstraints = CA:FALSE

"@ | Out-File -Encoding ascii localhost.conf

openssl req -x509 -newkey rsa:2048 -sha256 -days 3650 -nodes `

  -keyout "C:/wamp/ssl/localhost.key" `

  -out "C:/wamp/ssl/localhost.crt" `

  -subj "/CN=localhost" -config localhost.conf -extensions EXT

然后,在web服务器中如apache的虚拟主机中设置相应域名如下即可:

    ServerName   blog.localhost

    DocumentRoot "/var/www/html/blog"

    SSLEngine on

    SSLCertificateFile /etc/apache2/ssl/localhost.crt

    SSLCertificateKeyFile /etc/apache2/ssl/localhost.key

其他事项:

1.Windows 系统下 Apache 开启 ssl:

在 apache 配置文件 httpd.conf 中取消下面三行代码的注释:

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

LoadModule ssl_module modules/mod_ssl.so

Include conf/extra/httpd-ssl.conf

编辑 httpd-vhosts.conf 文件,将其中的以下两行

SSLCertificateFile "${SRVROOT}/conf/server.crt"

SSLCertificateKeyFile "${SRVROOT}/conf/server.key"

替换为我们申请的证书:

SSLCertificateFile "C:/wamp/ssl/localhost.crt"

SSLCertificateKeyFile "C:/wamp/ssl/localhost.key"

然后检查语法并重启apache即可:

httpd -t

httpd -k restart

2.导入证书:

若在 Windows 上使用,需手动将 localhost.crt 导入系统信任根证书;否则浏览器仍会显示“不受信任的自签名证书”警告。

按下 Win + R键,输入 “certlm.msc ”;在弹出证书管理窗口的左侧选择:受信任的根证书颁发机构 → 证书,然后右键点击 → 所有任务 → 导入;在导入向导中浏览选择 localhost.crt 证书文件并点击 下一步,证书存储区选择 “受信任的根证书颁发机构”后完成导入。

提示:重新生成同名证书后,要在windows证书管理中先删掉该证书,再重新导入证书,然后重启apache,重启浏览器新证书才起作用。

3.参数说明:

1)如果要支持 IPv6,也可加上:subjectAltName=DNS:localhost,IP:127.0.0.1,IP:::1

2)keyEncipherment 并不是严格必需的,用于提供更好的向-后兼容性,根据自己需要添加即可。

3)basicConstraints = CA:FALSE 推荐添加 告诉系统这不是 CA 证书(防止浏览器报 “证书链错误”)。

评论 (0)

暂无评论,快来抢沙发吧!

登录 后发表评论