Вам не хватает имени req.setClientCertificateName?
У меня есть код APEX, где Salesforce обращается к веб-службе на моем сайте. Я защитил его с помощью SSL на стороне клиента. Мой веб-сайт, хост, авторизует сертификат клиента от Salesforce.com (против традиционного веб-SSL, когда клиент браузера разрешает серверный сертификат). Вы можете создать самозаверяющий сертификат в Salesforce Admin в разделе Сертификат и управление ключами, а затем ссылаться на него с вызовом req.setClientCertificateName. Вот код из моего производственного орга:
HttpRequest req = new HttpRequest();
req.setMethod('POST');
req.setHeader('Host', 'www.mywebsite.com');
req.setEndpoint('https://www.mywebsite.com/post.asp');
try {
req.setClientCertificateName('Cert_For_MyWebSite');
} catch (System.CalloutException e) {
// The cert doesn't make it to the sandbox
}
req.setHeader('Connection', 'keep-alive');
req.setHeader('content-type', 'text/plain');
req.setHeader('Content-Length', body.length().format());
req.setBody(body);
Http http = new Http();
HttpResponse res = http.send(req);
System.debug(res.toString());
System.debug('STATUS:' + res.getStatus());
System.debug('STATUS_CODE:' + res.getStatusCode());
На сервере (IIS 7.5) я включил самостоятельно подписанный сертификат с этим web.config:
<configuration>
<system.webServer>
<security>
<access sslFlags="Ssl, SslNegotiateCert, SslRequireCert" />
<authentication>
<iisClientCertificateMappingAuthentication enabled="true" oneToOneCertificateMappingsEnabled="true">
<oneToOneMappings>
<!-- production salesforce -->
<add enabled="true"
userName="salesforce"
password="[enc:AesProvider:aaa...aaa:enc]"
certificate="MIIEaaa...aaa=" />
</oneToOneMappings>
</iisClientCertificateMappingAuthentication>
</authentication>
</security>
</system.webServer>
</configuration>