しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Management Libraries を Azure Web サイト上で利用する場合は証明書に注意

Azure Web サイトで Azure Management Libraries を使おうとすると、X509Certificate2 の作成時に必ずエラーになってしまいました。使った初期化コードは以下の記事と同じものになります。

Windows Azure Web サイトで国際化ドメイン名を使ってみた - しばやん雑記

自分が試した時にはエラーメッセージは以下のような感じでした。フラグによっては Access Denied が出たりもするみたいです。

ぶっちゃけローカルでは動いていた証明書が、Azure Web サイトに持っていっただけでエラーになるので困りました。仕方ないので先人の知恵に頼ろうと思ったのですが、割とみんな苦戦しているようです。

http://blog.tylerdoerksen.com/2013/08/23/pfx-certificate-files-and-windows-azure-websites/
http://www.bradygaster.com/post/using-publish-settings-files-to-authenticate-the-management-libraries

その中でも MSDN Forum に投稿された以下の記事が参考になりました。

http://social.msdn.microsoft.com/Forums/ja-JP/99ce89b8-17c8-464a-8135-9e18feb7d072/cant-use-publish-credentials-on-azure-websites?forum=windowsazurewebsitespreview

どうやら Azure からダウンロードできる publishsettings ファイルに含まれている証明書だとダメみたいです。ローカルにインストールされた何かを参照する必要があるみたいでした(知らんけど

なので、オレオレな証明書を作って管理ポータルから登録すれば使えるようになります。手順は兄者のブログが参考になるので、これをそのまま行うだけで大丈夫です。

Windows Azure SDK for .NET の Management Library を利用して Webサイト を動的に作成してみる - normalian blog

結局、X509Certificate2 を作る部分のコードは以下のようにしました。Base64Certificate は作成したオレオレ証明書で、エクスポート時にパスフレーズを入力した場合にはそれを指定してください。

var credentials = new CertificateCloudCredentials(SubscriptionId,
    new X509Certificate2(
        Convert.FromBase64String(Base64Certificate),
        "p@ssw0rd",
        X509KeyStorageFlags.MachineKeySet));

これで再度デプロイを行うと、正常に Management Libraries を使ったコードが実行できるはずです。

関係ないですが、Web サイト用の GetInstanceIds API はマジ面白いと思うので、何か使い道を考えてみたいと思いました。