IIS7(win server 2008 standard)で実行されているAsp.Net 1.1 Webサービス( https://dev-ms01/MsgService/default.asmx )があり、IIS以下は、ClientCertificate
認証用の.net
codeです。
private void Authenticate(DataTable dtUserMap,HttpContext context)
{
/// Convert the serial number from IIS to the DC format
/// which is: no dashs octets are in proper order.
string SerialNum = context.Request.ClientCertificate.SerialNumber.Replace("-","");
Debug.WriteLine("Authenticate User with cert = " + SerialNum);
/// get the column names from the table
string[] columnNames = new String[dtUserMap.Columns.Count];
/// populate the string array with the names
for(int i=0;i<dtUserMap.Columns.Count;i++)
{
columnNames[i] = dtUserMap.Columns[i].ColumnName;
}
/// Run a select query with the serial number
DataRow[] rows = dtUserMap.Select("SerialNumber='" + SerialNum + "'");
if (rows.Length==1){
/// the user exits
Debug.WriteLine("User Authenticated");
// further logic
}
else
{
/// either too many users or not any users
Debug.WriteLine("No single User Found");
context.Items.Add("IsAuthenticated",false);
}
}
TLS 1.2をサポートするようにApache2.4サーバーをセットアップし、IISのプロキシとしても機能します。以下はApache構成です。
<VirtualHost *:443>
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
ServerName secure-dev-ms01
SSLEngine on
SSLProtocol -ALL TLSv1.2
SSLVerifyClient optional
SSLVerifyDepth 3
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "C:/Elm/Apache/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
SSLProxyEngine On
SSLOptions +ExportCertData
ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
#ProxyPass should be prior to any other Proxy directives
ProxyPass / http://dev-ms01:80/
ProxyPassReverse / http://dev-ms01:80/
RewriteEngine on
RequestHeader set X_SSL_CLIENT_M_SERIAL "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set X_FORWARDED_PROTO "https" env=HTTPS
RequestHeader set SslSubject "%{SSL_CLIENT_S_DN}s"
</VirtualHost>
https://secure-dev-ms01/MsgService/default.asmx URLを参照すると、クライアント証明書の入力を求められます。クライアント証明書を選択すると、想定されている承認済みコンテンツが表示されません。確認するには、ApacheのSSLOptions +ExportCertData
構成がクライアント証明書をIIS
に転送していないと思われます。ApacheからIISにクライアント証明書を転送する方法に関する情報/記事があまり見つかりませんでした。
IISへのクライアント証明書認証用にフォワードプロキシを使用してApacheを構成するのを手伝ってもらえますか?
更新1:
リクエストをhttps://dev-ms01/
ではなくhttp://dev-ms01:80/
に転送し、ApacheVirtualHostのSSL_*
リクエストヘッダーを以下のように設定しようとしましたが、それでもうまくいきませんでした
SSLProxyEngine On
SSLOptions +ExportCertData +StdEnvVars
#ProxyPreserveHost On
ProxyRequests Off
ProxyVia On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
#ProxyPass should be prior to any other Proxy directives
ProxyPass / https://dev-ms01/
ProxyPassReverse / https://dev-ms01/
RewriteEngine on
RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}s"
RequestHeader set SSL_CLIENT_I_DN "%{SSL_CLIENT_I_DN}s"
RequestHeader set SSL_SERVER_S_DN_OU "%{SSL_SERVER_S_DN_OU}s"
RequestHeader set SSL_CLIENT_S_DN_CN "%{SSL_SERVER_S_DN_CN}s"
RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s"
RequestHeader set SSL_CLIENT_V_START "%{SSL_CLIENT_V_START}s"
RequestHeader set SSL_CLIENT_V_END "%{SSL_CLIENT_V_END}s"
RequestHeader set SSL_CLIENT_M_VERSION "%{SSL_CLIENT_M_VERSION}s"
RequestHeader set SSL_CLIENT_M_SERIAL "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set SSL_CLIENT_CERT "%{SSL_CLIENT_CERT}s"
RequestHeader set SSL_CLIENT_CERT_CHAIN_0 "%{SSL_CLIENT_CERT_CHAIN_0}s"
RequestHeader set SSL_CLIENT_CERT_CHAIN_1 "%{SSL_CLIENT_CERT_CHAIN_1}s"
RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s"
RequestHeader set SSL_SERVER_M_VERSION "%{SSL_SERVER_M_VERSION}s"
RequestHeader set SSL_SERVER_I_DN "%{SSL_SERVER_I_DN}s"
RequestHeader set SSL_SERVER_CERT "%{SSL_SERVER_CERT}s"
RequestHeader set X_SSL_CLIENT_M_SERIAL "%{SSL_CLIENT_M_SERIAL}s"
RequestHeader set X_FORWARDED_PROTO "https" env=HTTPS
RequestHeader set SslSubject "%{SSL_CLIENT_S_DN}s"
ApacheがTLS要求を終了した場合、IISから元のクライアント証明書を表示する方法はありません。Apacheのプロキシ機能がhttps要求を開始する方法はありません。 Apacheは関連付けられた秘密鍵にアクセスできないため、元のクライアント証明書。
クライアント証明書をIISに転送しないApacheのSSLOptions + ExportCertData構成
それはExportCertData
オプションが行うことではありません。このオプションは、CGIまたはApacheの他のディレクティブで使用できるいくつかの環境変数を設定するだけです。その証明書を魔法のように渡すことはありません。 RequestHeader ... lines.
でこれらの変数のいくつかを使用しています。
本当にApacheでリクエストをプロキシする必要がある場合は、プロキシの背後にあるアプリケーションを更新して、Apacheで設定しているHTTPヘッダーを証明書と同等のものとして受け入れて信頼する必要があります。