Mutual authentication(two-way authentication) Callout (サーバ認証 編)

Callout の構成としては以下の通り。

  • Server: Nginx (ssl.mydomain.com という Virtual ドメイン)
  • Client : Salesforce
  • Salesforce の Callout の場合、サーバ側の SSL 証明書は Salesforce で信頼される認証局の証明書である必要がある。対応している証明書は Outbound Messaging SSL CA Certificates にリストされている。そのうち、今回は以下のような証明書。

  • ルート証明書(Root CA): Add Trust External CA
  • 中間証明書(Intermediate CA): “COMODO RSA Add Trust CA”
  • 中間証明書(Intermediate CA): “COMODO RSA Domain Validation Secure Server CA”
  • サーバ証明書の鍵と CSR(Certificate Signing Request) 作成

    # cd /root
    # mkdir .ssl_certification
    
    # openssl genrsa -out ssl.mydomain.com.key 2048
    # openssl req -new -key ssl.mydomain.com.key -out ssl.mydomain.com.csr -sha1
      Country Name (2 letter code) [AU]:JP
      State or Province Name (full name) [Some-State]:Tokyo
      Locality Name (eg, city) []:Adachiku
      Organization Name (eg, company) [Internet Widgits Pty Ltd]:MYDOMAIN
      Organizational Unit Name (eg, section) []:
      Common Name (e.g. server FQDN or YOUR name) []:ssl.mydomain.com
      Email Address []:
    
      Please enter the following 'extra' attributes
      to be sent with your certificate request
      A challenge password []:
      An optional company name []:
    
    # openssl req -in server.csr -text -noout
    

    サーバ証明書の作成

    今回は namecheap で [Security] | [SSL Certificates] から “Domain Validation” の “COMODO PositiveSSL” を利用する。ウィザードに従って、上記で作成した CSR をアップロードすると、時間経過後にルート/中間証明書の一式が ZIP で送付される。

    サーバ証明書の作成と Nginx の設定

    サーバ証明書、ルート証明書、中間証明書のマージ。

    # cat ssl_mydomain_com.crt COMODORSAAddTrustCA.crt COMODORSADomainValidationSecureServerCA.crt AddTrustExternalCARoot.crt > ssl.mydomain.com.crt
    

    証明書の配置と Nginx の設定変更。

    # cd /etc/nginx
    # mkdir ssl
    # cp ssl.mydomain.com.key ssl/
    # cp ssl.mydomain.com.crt ssl/
    
    # vi sites-available/ssl.domain.com
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    server {
      listen 80;
      listen 443;
      server_name ssl.mydomain.com;
    
      access_log  /var/log/nginx/ssl-access.log;
      error_log   /var/log/nginx/ssl-error.log;
    
      # for SSL
      ssl on;
      ssl_certificate     /etc/nginx/ssl/ssl.mydomain.com.crt;
      ssl_certificate_key /etc/nginx/ssl/ssl.mydomain.com.key;
      ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    
      location / {
        root   /home/ssl/public_html;
        index  index.html index.htm;
      }
    }
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    # ln -s /etc/nginx/sites-available/ssl.mydomain.com /etc/nginx/sites-enabled/ssl.mydomain.com
    
    # service nginx restart
    

    Callout での疎通確認

    事前に [管理者設定] | [セキュリティのコントロール] | [リモートサイトの設定] で Callout 先を登録する。

  • リモートサイト名: Callout endpoint
  • リモートサイトの URL: https://ssl.mydomain.com
  • 開発者コンソール等から、以下を実行。

    HttpRequest req = new HttpRequest();
    req.setEndpoint('https://ssl.mydomain.com');
    req.setMethod('GET');
    Http http = new Http();
    HttpResponse res = http.send(req);
    System.debug('zzz getStatusCode: ' + res.getStatusCode());
    System.debug('zzz getBody: ' + res.getBody());
    System.debug('zzz response: ' + res);
    

    中間証明書がない場合は以下のエラーとなる。

    System.CalloutException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    

    コメントを残す