LoginSignup
6
10

More than 5 years have passed since last update.

Let's Encryptで発行した証明書をRemote Desktopの証明書にも割り当ててみる

Last updated at Posted at 2017-02-08

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 の証明書がインポートされますが、これは削除してはダメです。削除するとリモートデスクトップサービスから証明書を参照できなくなるからです。こうなると残念ながらリモートデスクトップ接続で無効な証明書のワーニングが出る状態に戻ってしまいます。

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10