Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

.NET CoreのHttpClientで無効な証明書を無視する

下書きに埋もれてたので発掘。よくある自己署名的なサーバーにHttpClientでアクセスする際、無視する話です。

.NET Frameworkでは、ServicePointManager.ServerCertificateValidationCallback を使っていたんですけど、.NET Coreでは効かないです。

以下のstackoverflowの回答にあるとおり、HttpClientHandler を使えばよいみたいですね。

stackoverflow.com

コードはこんな感じになります。

using (var httpClientHandler = new HttpClientHandler())
{
   httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; };
   using (var client = new HttpClient(httpClientHandler))
   {
       // Make your request...
   }
}

開発環境から簡単にKey Vaultにアクセスする

前記事の続き

では開発環境からはどうするか?という話。いくつか方法はありますが、

.NET を使用した Azure Key Vault に対するサービス間認証 | Microsoft Docs

ここら辺に記述があります。

Visual Studioで

VSのAzure Services Authentication Extension 拡張機能をインストールします。 VSのオプションメニューにAzure 認証的なものがでるので、そのサブスクリプションにアクセス可能なアカウントを設定します。

f:id:StateMachine:20180310112058p:plain

普通にアクセスできちゃいます。ただし、このアカウントがKey Vaultへのアクセス権限がないといけません。それはKey Vaultのアクセスポリシーから確認してみてください。自分のサブスクリプションで自分がKey Vault作成したら、自分のアカウントが設定されていると思います。

あとは、az コマンドであらかじめ設定する方法とかもありますが、ふつうVS使っている感がありますのでこれで問題ないかと思います。

つぎは、Configratiuonから透過的にアクセスする方法など。

管理対象サービスID で簡単にAzure Key Vaultにアクセスする

管理対象サービスID 「 Managed Service Identity (MSI)」というのを使うとAzure Key Vaultへのアクセスが簡単になるので、その備忘録。

MSI(インストーラではありません)は、VMやWebAppsなど各種Azure プラットフォーム(VMやWebAppsなど)でサポートしており、ADと連携しているリソースへのアクセスが簡単になります。

これを有効にしておくと、アプリからKey Vaultへのアクセスすると楽になります。

現時点でPreviewですが以下のパッケージを入れます(とKey Vaultも)

例えばアクセスする側のプログラムは以下。

var azureServiceTokenProvider = new AzureServiceTokenProvider();
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var keys = client.GetKeysAsync("https://hogekeyvault.vault.azure.net/").Result;
foreach(var key in keys)
{
    Debug.WriteLine(key.Kid);
}

Tokenとってきて、Key Vaultに投げてアクセスさえてもらうという感じになりますが、VMに何も設定してないと当然エラーになるわけですが。

VM側の設定

構成から管理対象サービスIDをオンにします。構成という汎用度の高いメニュー名なので、よく見失います。

f:id:StateMachine:20180310105153p:plain

これを設定すると、ADにこのVMのサービスプリンシパルが登録されます。そして(というこもともと)、localhostに以下のリクエストを投げるとTokenが取得できるようになります。

Invoke-WebRequest -Uri http://localhost:50342/oauth2/token -Method GET -Body @{resource="https://vault.azure.net"} -Headers @{Metadata="true"} 

このTokenをKey Vaultに投げて承認してもらうと、Key Vaultへのアクセスが可能になるわけです。

Key Vaultの設定

アクセスポリシーからアクセスポリシーを追加します。プリンシパルには、VM名を指定します。アクセス許可する範囲は適宜。

f:id:StateMachine:20180310105834p:plain

選択したのち最後に保存します。(よく保存を忘れるので気を付けて)

実行

ここまで設定すると先ほどのアプリが実行できるようになります。

つづく