关注网络安全
和行业未来

用自签发证书为个人Windows容器添加HTTPS支持

本文由Benjamin Xue发表自微软开发者博客

有两种Windows容器可以用Windows Server Containers和Windows Hyper-V Containers处理。虽然一个Windows Server容器与容器主机及运行在该主机上的所有容器共享一个核心时,但却并不与Hyper-V Containers共享该容器主机的核心,这导致容器主机和容器之间的隔绝带来了额外的好处。你可以用docker run、dockerfile and build和docker compose等命令来创建Windows Containers。你也可以在 Container Images on Windows Server和Multi-Container Applications上发现更多细节,后者是一个用Windows容器开发的音乐商店应用样本。

本文会重点讲解基于测试目的使用自签发证书为Windows Containers添加HTTPS支持。注意,本文是通过Azure平台在VM虚拟机上运行的Windows Server 2016环境下使用Container的。

选项1——使用docker run命令

docker run -ti –entrypoint cmd -p 80:80 -p 443:443 -h myweb -v c:\demo\appfiles:c:\temp microsoft/aspnet

注意命令行中使用了几个选项。“-ti”选项是互动会话,“-p”选项是端口映射,“-v”选项是vm虚拟机上名为demo的本地文件夹到名为temp的容器文件夹的卷映射。用ipconfig命令找到容器的本地ip地址后,你就可以通过http而不是https来访问位于“Default Web Site”上的app了。原因在于,该网站没有分配到安全证书。

 

用下面的PowerShell脚本创建一个新证书,并把它添加到容器上的证书库的可信根证书中,然后把它绑定到443端口。注意,New-SelfSignedCertificate命令创建了一个基于测试目的的自签发证书。它是makecert工具的继承者。你可以在这里找到关于该工具的更多信息。

import-module webadministration
#Get-Module -ListAvailable

cd cert:
$cert = New-SelfSignedCertificate -DnsName  myweb -Friendlyname MyCert -CertStoreLocation Cert:\LocalMachine\My
$rootStore = New-Object System.Security.Cryptography.X509Certificates.X509Store -ArgumentList Root, LocalMachine
$rootStore.Open(“MaxAllowed”)
$rootStore.Add($cert)
$rootStore.Close()

cd iis:
new-item -path IIS:\SslBindings\0.0.0.0!443 -value $cert
New-WebBinding -Name “Default Web Site” -IP “*” -Port 443 -Protocol https
iisreset

刷新https网页。现在应该可以访问它了。注意,尽管创建的证书已经被添加到可信根证书中,但你还是可能会收到一个安全证书警告。(相同的脚本在我的本地IIS服务器上能够正常运行,我也没有收到证书警告和错误提示。)原因在于,它是一个自签发证书,不像商用的证书那样,由一个可信机构联合签发。

选项2——使用在github上发布的dockerfile

首先,用docker id创建一个容器,命名为xuedocker。

docker build -t xuedocker/iishttps .\

docker images

docker run -it –entrypoint cmd -p 80:80 -p 443:443 -h myweb -v c:\demo\appfiles:c:\temp xuedocker/iishttps

然后,从被映射的temp文件夹复制一个样本htm文件到容器上的“c:\iputnet\wwwroot”。就可以通过http或https访问样本app了。

注意安全证书警告。这是因为该证书不在你的容器的可信根证书中。因为容器并不为你提供常规的Windows用户界面,你无法像下面这样通过证书管理器检查证书是否在根证书文件夹中。

但你可以运行PowerShell命令来验证它是否存在。

import-module webadministration

cd cert:

cd localmachine

cd my

dir

cd..

cd root

dir

使用PowerShell命令核对证书指纹,将自签发证书添加到可信根证书中。

$cert = cert:\localmachine\my\gci EB61F71C77E561B2148F9F207A3468BAF794DF07

$rootStore = New-Object System.Security.Cryptography.X509Certificates.X509Store -ArgumentList Root, LocalMachine

$rootStore.Open(“MaxAllowed”)

$rootStore.Add($cert)

$rootStore.Close()

现在,该证书已被添加到可信根证书中。注意该证书已被绑定到443端口,执行下面的命令会返回错误提示。

cd iis:
new-item -path IIS:\SslBindings\0.0.0.0!443 -value $cert
New-WebBinding -Name “Default Web Site” -IP “*” -Port 443 -Protocol https
iisreset

 

选项3——使用import-certificateimport-pfxcertificate方法

如果你用的是商用证书,就可以用import-certificate和import-pfxcertificate方法将证书导入容器中。在测试完这个选项后,会提供更多细节。

最后,Windows Container团队的高级项目经理Patrick Lang提到其他两个关于SSL和容器的研究方法。

一个是SSL Load balancer。添加这一选项后,一个SSL load balancer就会代表web服务器或容器对请求进行解密并对响应进行加密。

更多内容请看

https://www.nginx.com/resources/glossary/ssl-load-balancer/

https://dzone.com/articles/load-balancing-containers-with-docker-swarm-and-ng

第二个是Docker v1.13中的安全存储。这一功能的工作流程是类似下面这样的。

  1. 通过任何你知道的方法创建证书
  2. 将其导出为PKCS#7或任何其他可以表示为ascii文本的格式
  3. Docker秘密创建并将证书存储在raft中
  4. 创建一个脚本或可执行程序,在以下容器内运行:

(1)可以找到能够进入的证书的容器

(2)可以将其导入到Windows证书库的容器。

  1. 完成IIS或其他其他服务设置

更多内容请访问

https://lostechies.com/gabrielschenker/2016/11/25/docker-and-swarmkit-part-6-new-features-of-v1-13/

评论 抢沙发