* クライアント認証付きのHTTPSリクエスト発行 [#j45d5863]
#setlinebreak(on);

[[Apache+openSSLでクライアント認証]] で作った HTTPSクライアント認証環境に対してプログラムからアクセスするサンプル。
&br;
#contents
-- 関連
--- [[Apache+openSSLでクライアント認証]]
--- [[ApacheでSSL(SNI)設定]]
--- [[Javaでhttps通信時の証明書検証について]]

** Pythonの場合 [#la02f8c2]
#html(<div style="padding-left:10px">)

参考 : https://docs.python.jp/3/library/ssl.html#ssl.SSLContext.load_cert_chain

#html(){{
<pre class="prettyprint linenums">
# coding: UTF-8

import json
import ssl 

#import urllib2 as request  # python2系
from urllib import request # python3系

# アクセス先のURL
url = 'https://example.com/api/books/'

# プライベートCAの証明書
cafile = '/var/certs/myCA/myca.crt'

# クライアント証明書
client_certfile = '/var/certs/example.com-client1.crt'

# クライアント秘密鍵
client_keyfile  = '/var/certs/example.com-client1.key'

# クライアント鍵のパスワード
client_password = 'password'

sslctx = ssl.create_default_context()

# CA証明書ファイルをロード( 1ファイルに纏めれば load_cert_chain だけでもいける気がする )
sslctx.load_verify_locations(cafile=cafile)

# クライアント証明書をロード
#sslctx.load_default_certs(ssl.Purpose.CLIENT_AUTH);

# 秘密鍵と対応する証明書をロード
sslctx.load_cert_chain(certfile=client_certfile, keyfile=client_keyfile, password=client_password)

r = request.urlopen(url, context=sslctx)
headers = r.info()
print ( '##### headers #####' )
print ( headers )

data = r.read()
if headers["Content-Type"] == "application/json":
  data = json.loads( data )

print ( '##### body #####' )
print ( data )
</pre>
}}
#html(</div>)


** Nodejs の場合 [#o7117836]
#html(<div style="padding-left:10px">)

#html(){{
<pre class="prettyprint linenums">

var fs = require('fs');
var request = require('request');

// アクセス先のURL
url = 'https://example.com/api/books/'

// CA証明書
var caFile = '/var/certs/myCA/myca.crt';

// クライアント証明書
var clientCertFile = '/var/certs/example.com-client1.crt');

// クライアント秘密鍵
var clientKeyFile = '/var/certs/example.com-client1.key');

// クライアント鍵のパスワード
var clientPassword= 'password'

var options = { 
    url: url,
    cert: fs.readFileSync(clientCertFile),
    key: fs.readFileSync(clientKeyFile),
    passphrase: clientPassword,
    ca: fs.readFileSync(caFile)
};

request.get(options, function (error, response, body) {
  if (error) {
    console.error(error);
  } else {
    console.log(body);
  }
});
</pre>
}}
#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS