Let's Encrypt で IIS に証明書を割り当てる試験をしていて、ふと思った。これを Remote Desktop 接続の証明書にも使えないかと。
そしてやってみたら、一応できたっぽい。
手作業でやる方法
手作業でやる場合は、基本的には下記URLの内容のとおりです。
http://www.atmarkit.co.jp/ait/articles/1309/20/news036.html
Let's Encrypt で発行された証明書は下記のようなパスに [FQDNホスト名]-all.pfx という名前で保存されていましたので、これを個人の証明書ストアにインポートした上で、それを上記URLの「PowerShellで証明書を割り当てる方法」の通りに処理すればOKです。
C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\
もうちょっと自動化したい
こちらのURLに出ている手順を参考にすれば、もうちょっと自動化できそうです。
http://blog.engineer-memo.com/2016/08/19/remote-desktop-%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E5%90%8C%E4%B8%80%E3%81%AE%E6%8B%87%E5%8D%B0%E3%81%A7%E9%87%8D%E8%A4%87%E3%82%A4%E3%83%B3%E3%83%9D/
ただし Let's Encrypt の証明書発行処理で生成された pfx ファイルはパスワードがありません。このためにこのまま実行するとエラーになってしまうようです。
そこで手順を少し弄ってエラーが出ない状態にしたのが下記の内容です。$certpath には実際に使用する証明書のフルパスを記述します。
$certpath = "C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\[FQDNホスト名]-all.pfx"
$certpass = ""
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $certpath, $certpass, ([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::DefaultKeySet)
if((Get-ChildItem Cert:\LocalMachine\My).Thumbprint -notcontains $cert.Thumbprint){
Write-host "Cert Import"
Import-PfxCertificate -CertStoreLocation "cert:\LocalMachine\My" -FilePath $certpath
}
if((Get-ItemProperty 'registry::\HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp').SSLCertificateSHA1Hash -ne $null){
Remove-ItemProperty "registry::\HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name SSLCertificateSHA1Hash
}
$path = (Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices -Filter "TerminalName='RDP-tcp'").__path
Set-WmiInstance -Path $path -argument @{SSLCertificateSHA1Hash="$($cert.Thumbprint)"}
$cert.Dispose()
これで Remote Desktop 向けの証明書割り当てが概ね自動化できそうです。
注意点
この手順通りに作業を行うと、cert:\LocalMachine\My にも Let's Encrypt の証明書がインポートされますが、これは削除してはダメです。削除するとリモートデスクトップサービスから証明書を参照できなくなるからです。こうなると残念ながらリモートデスクトップ接続で無効な証明書のワーニングが出る状態に戻ってしまいます。