#1. はじめに
この記事は、以下の記事の続編です。
- CIS(IBM Cloud Internet Service)でmTLSを構成する(1) - 基本設定編
- CIS(IBM Cloud Internet Service)でmTLSを構成する(2) - クライアント証明書をブラウザに設定
mTLSを単純に構成しただけではクライアント情報はOrigin Serverには含まれていないため、クライアント証明書の情報をCIS Edge Functions(Cloudflare Workers相当)を使って、クライアント証明書情報を付与する。
#2. mTLS構成直後のHTTPリクエストヘッダー一覧
Apache+CGIで全てのHTTPリクエストヘッダを出力するを構成して、まずどのようなHTTPヘッダがOriginサーバーに渡ってきているかを確認してみる。
実質上、クライアントを判別する情報は、CF_CONNECTING_IP
やX_FORWARDED_FOR
に含まれるクライアントのIPアドレスぐらいしかない。
#3. CIS Edge Functionsを使ってクラアイント証明書をHTTPヘッダに付与する。
##3-1. Actionの追加
Action nameは任意。コードは、こちらのサンプルコードがそのまま動くので、そのまま貼り付ける。
addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request));
});
function getHeaders(headers) {
let heads = {};
for (let h of headers.entries()) {
heads[h[0]] = h[1];
}
return heads;
}
function handleRequest(request) {
let headers = {};
if (request.cf && request.cf.tlsClientAuth.certPresented) {
const tlsHeaders = {
'X-CERT-ISSUER-DN': request.cf.tlsClientAuth.certIssuerDN,
'X-CERT-SUBJECT-DN': request.cf.tlsClientAuth.certSubjectDN,
'X-CERT-ISSUER-DN-L': request.cf.tlsClientAuth.certIssuerDNLegacy,
'X-CERT-SUBJECT-DN-L': request.cf.tlsClientAuth.certSubjectDNLegacy,
'X-CERT-SERIAL': request.cf.tlsClientAuth.certSerial,
'X-CERT-FINGER': request.cf.tlsClientAuth.certFingerprintSHA1,
'X-CERT-VERIFY': request.cf.tlsClientAuth.certVerified,
'X-CERT-NOTBE': request.cf.tlsClientAuth.certNotBefore,
'X-CERT-NOTAF': request.cf.tlsClientAuth.certNotAfter
};
Object.assign(headers, tlsHeaders);
}
Object.assign(headers, getHeaders(request.headers));
return fetch(request, {
headers: new Headers(headers)
});
}
#4. テスト
CA証明書およびクライアント証明書の情報がHTTPリクエストヘッダに登録されてOriginサーバーに渡ってきていることがわかる。
参考までに、CA証明書とクライアント証明書作成時のCSR情報を再掲する。
{
"CN": "Access Testing CA",
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "US",
"L": "Austin",
"O": "Access Testing",
"OU": "TX",
"ST": "Texas"
}
]
}
{
"CN": "James Royal",
"hosts": [""],
"key": {
"algo": "rsa",
"size": 4096
},
"names": [
{
"C": "US",
"L": "Austin",
"O": "Access",
"OU": "Access Admins",
"ST": "Texas"
}
]
}