HTTPS を必要とし、クライアント証明書で認証される .NET 4 (Visual Studio 2010) で Web サービスを使用しようとしています。現在、概念を証明するためだけにコンソールプログラムを書いていますが、httpsを使用する必要があることをプログラムに認識させるのに問題があります。少なくともそれはエラーが示唆するものです:
https:// への HTTP 要求の作成中にエラーが発生しました。これは、HTTPS の場合、サーバー証明書が HTTP.SYS で適切に構成されていないことが原因である可能性があります。これは、クライアントとサーバー間のセキュリティ バインディングの不一致が原因である可能性もあります。
私が使用しているサンプルコードは次のとおりです。
class Program
{
static void Main(string[] args)
{
try
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
Uri baseAddress = new Uri("https://<host>:<port>/<endpoint>");
var certificate = new X509Certificate2("<localpath to certificate>.p12", "<password>");
EndpointAddress endpointAddress = new EndpointAddress(baseAddress);
ChannelFactory<LinePortType> factory = new ChannelFactory<LinePortType>(binding, endpointAddress);
factory.Credentials.ClientCertificate.Certificate = certificate;
LinePortType proxy = factory.CreateChannel();
var header = new ctSoapHeaderMsg();
var response = new object();
var request = new PerformServiceRequest(header, "<string>");
var responseCode = proxy.PerformService(request);
Console.WriteLine("Response Code :" + responseCode.ToString());
Console.WriteLine("Response :" + response.ToString());
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
Console.ReadLine(); // Pause
}
}
機密性の高い文字列のいくつかをプレースホルダーに置き換えました。
証明書を適切に構成できないことが問題である可能性は十分にあります。最終的には、これをローカルの証明書ストアからロードすることを望んでいるので、コードまたは構成でパスワードを指定する必要はありません。
LinePortType は、ローカル WSDL に基づくサービス リファレンスです。WSDL は実稼働環境用だったので、エンドポイントを変更して、代わりに UAT 環境を参照します。
srsyogesh の推奨に従って、WSHttpBinding を使用するように更新しましたが、それでも同じエラーが発生します。
try 内のコードは次のようになります。
var binding = new WSHttpBinding();
binding.Security.Mode = SecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var baseAddress = new Uri("https://<host>:<port>/<endpoint>");
var endpointAddress = new EndpointAddress(baseAddress);
var client = new LinePortTypeClient(binding, endpointAddress);
client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByIssuerName, "<issuername>");
var header = new ctSoapHeaderMsg();
var response = new object();
var responseCode = client.PerformTelstraSQ(ref header, "<string>", out response);
Console.WriteLine("Response Code :" + responseCode);
Console.WriteLine("Response :" + response);