Generating KDC Certificate for PacketCable

測試 PacketCable Secure provisioning 時需要用到 KDC, 如果是用真實的 certificate , 那大家都一樣,不會有問題,但一般測試時都是用 test certificate, 這時就可能遇到不一致的問題了, 經過種種不可考得原因, 手邊出現了2組 KDC certificate, 造成兩邊測試結果不同,觀察後發現一邊用的是 Cablelabs 提供的 test certificate, 另一邊是不知道誰按照 spec 一層層做出來的 certificate, 為了讓以後測試一致, 把 KDC certificate 用 Cablelabs 提供的 test certificate 重新 sign 過就可以了

這部份的 spec 在 PKT-SP-SEC1.5-I03-090624 的 8 PACKETCABLE CERTIFICATES
在 PacketCable 裡有2組 certificate

MTA
  MTA Root -> MTA Manufacturer -> MTA 

Service Provider
  Service Provider Root -> Service Provider CA -> Local System Operator CA -> KDC

這次要玩的是 KDC 這一張 certificate, 所以只要拿 Local System Operator CA 重新簽發 KDC 就可以了
先從 Cablelabs 下載 Test PacketCable CableLabs Service Provider PKI CA Certs
把 Test_Shared_LSCA 的 private key 解出來, 密碼是 secret


再重新製作 KDC 的 CSR, 把 CSR 用 Test_Shared_LSCA.pem sign過就可以了
製作前先看 spec 對 KDC 這著 certificate 各欄位的規範

Key Distribution Center Certificate
Subject Name Form C=<Country>
O=<Company>
[OU=<Local System Name>]
OU= CableLabs Key Distribution Center
CN=<DNS Name>
Signed By Service Provider CA Certificate or Local System Certificate
Validity Period 20 years.
Modulus Length 1024, 1536 or 2048
Extensions keyUsage[c,o](digitalSignature)
authorityKeyIdentifier[n,m](keyIdentifier=<subjectKeyIdentifier value from CA certificate>)
subjectAltName[n,m](See draft-ietf-cat-kerberos-pk-init-16.txt)

Subject Name:
C,O,OU,CN, 這4個值根據測試環境調整, 第一個 OU=Local System Name可以省略,第二個 OU= CableLabs Key Distribution Center 為固定值
Extensions:
c:critical, n:non-critical; m:mandatory, o:optional
keyUsage可以省略,但有加的話要標示為c:critical
authorityKeyIdentifier 和 subjectAltName 一定要有, subjectAltName 的格式比較複雜( draft-ietf-cat-kerberos-pk-init-16.txt -> 3.2.2.2. Kerberos Names in Certificates)
subjectAltName 的內容是 KDC 的 Realm 和 principal name

看完規則後就可以用 openssl 來製作 certificate 了
參考 MIT Kerberos Documentation 的步驟修成符合 PacketCable 的格式

1. 產生 KDC key, 若要沿用舊的可以跳過, 如果本的 key 不是 pem 格式可以先轉一下會比較方便, openssl 預設是吃 pem 格式


2.用 kdckey.pem 產生CSR
先製作openssl.conf
[req]
default_md = sha1
prompt = no
distinguished_name = req_DN
string_mask = default 
# 設定字串編碼方式,spec 是說 If a string cannot be encoded as a PrintableString it MUST be encoded as a UTF8String (tag [UNIVERSAL12]).
# default 會先用 PrintableString 編碼,若 SubjectName 和 IssuerName 沒什麼特殊字元設 default 就可以了

[ req_DN ]
# 這邊根據測試環境填上對應的值,如果是要把舊的 kdc certificate 重 sign,就打開 certificate 照抄就可以了
C= TW
O= ABCDE
1.OU= Shared-01 CableLabs Local System CA
2.OU= CableLabs Key Distribution Center
CN= kdc.test.com

#==============================================
# 以下為 sign certificate 時要加入的 extension欄位
# 比較複雜的是subjectAltName,詳細語法說明在 https://www.openssl.org/docs/crypto/ASN1_generate_nconf.html
# 
[kdc_cert]
keyUsage=critical,digitalSignature
authorityKeyIdentifier=keyid,issuer
subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:kdc_princ_name

[kdc_princ_name]
realm=EXP:0,GeneralString:REALM.COM
principal_name=EXP:1,SEQUENCE:kdc_principal_seq

[kdc_principal_seq]
name_type=EXP:0,INTEGER:1
name_string=EXP:1,SEQUENCE:kdc_principals

[kdc_principals]
princ1=GeneralString:krbtgt
princ2=GeneralString:REALM.COM

用 req 指令產生CSR


再用 x509 指令 sign CSR, 演匴法是 sha1WithRSAEncryption


最後再把 kdckey.pem kdc.pem 轉成 KDC 程式需要的格式就可以了
比較常見的就 der 格式, private 又有分 pkcs1/pkcs8





沒有留言:

張貼留言