ふとWindows Azure SDK 1.5に付属するCSEncryptコマンドを使って暗号化されたパスワードな文字列を生成して、RDPのユーザーパスワードに設定して配置後、接続しようとするとどうも認証ではじかれる。
管理ポータルから再設定したらちゃんと入れるし、Visual Studioを使用してCSCFGファイル作れば問題なし=CSEncryptが何かおかしい。という状況に陥りました。
打ち間違いもなく、何ならコピペでやってるから絶対同じなのにおかしいなぁ~と思ってよくよく、ゆっくりと入力してみると…
あああ! $ が入力されなイイイイイイ!!
タイプしても、ペーストしてもスルー!!!/(^o^)\
というわけで原因はCSEncryptで(というかPowerShellで?)$が入力できない、ということでした。ちゃんちゃん。
いやいやいや、入力できないと困ります。
ということでどうするかといいますと。リダイレクトすればいいわけですねー。
こんなファイルを用意しまして、
という感じで標準入力にリダイレクトしてあげるといいようです。
ちなみにちゃんと$込で暗号化されてるのか不安ですよね。ちょっと復号してみてみましょう。
[Reflection.Assembly]::LoadWithPartialName("System.Security") $source = "<Base64な暗号化された文字列>" $thumbprint = "<証明書の拇印>" $store = new-object System.Security.Cryptography.X509Certificates.X509Store My,CurrentUser $store.Open("ReadOnly") $cert = $store.Certificates.Find(0,$thumbprint,0) $env = new-object Security.Cryptography.Pkcs.EnvelopedCms $env.Decode([Convert]::FromBase64String($source)) $env.Decrypt($cert) [Text.Encoding]::UTF8.GetString($env.ContentInfo.Content)
こんな感じのコマンドをPowerShell上で実行してあげると復号して元文字列を取り出せます。
結果は同じ、$もOKですね!
※ちなみに暗号化には公開鍵を、復号には秘密鍵を利用しているので暗号化する際に使用した秘密鍵付証明書が個人用証明書ストアに保存されてないとダメです。逆に言えば秘密鍵付証明書(とパスワード)があれば簡単に復号できちゃいますということで。
今日はこの挙動に悩まされた一日でした…とほほ。
CSEncrypt.exeはPowerShellもどきのパラメータを取るだけで、PowerShellとは無関係な気がしますよー
なぜ素直にSDKのツール群をPowerShellのコマンドレットにしなかったのかとも思いますが…
Windows Azure Platform PowerShell CmdletsがSDKに同梱される日は来るのだろうか…
そうですね。もともとPowerShellで暗号化してたので勘違いしてました。(そのわりには挙動がPowerShellっぽい…)
纏めてほしいところではありますがいろいろ思想があるんでしょうね~…
ピンバック: パスワードに”$”を使うのはダメなの? « MCTの憂鬱
ピンバック: パスワードに”$”を使うのはダメなの?