CACAnet証明書発行システム
cacanet-talkのみなさま 山崎@CACAnetです。
昨日から本格的にCACAnetのCAの証明書やサーバー証明書の作成作業を開始しました。
まだ、運営方針の面でも技術面でもいろいろと問題がありますが、この段階から公開
して、みなさんのご意見をおうかがいしながら作業を進めていこうと思いますので、
よろしくお願いします。
現在の方針について書いておきます。
■文書による合意と当事者自治の原則
JIPDECが実施している「プライバシーマーク」などと同様に、当事者による文書によ
る合意を徹底的に積み上げるシステムを作り、契約法の枠組みを利用して「当事者自
治」の形で証明書利用者の権利保護やCAの責任範囲の限定などに対処するというアプ
ローチが現実的なのではないかと考えています。
CACAnetのCAおよび全てのRAは一定の(公的?)ガイドラインに準拠した運用規定書
を作成しCACAnetはこれをレビューし、署名して公開することをもってRAの正統性の
根拠とすることを考えています。
こういった話の前提として、CACAnetの証明書は「実印」の印鑑証明よりももっとカ
ジュアルなものであるが、個人情報の保護や日常的な契約や手続きなどにはきちんと
実用的に機能するものにしたいという目的があります。
■RA主義
CACAnetは、CAとしてのサービスを行なうが、実際の証明書の発行はCACAnetと個別の
承認関係を持つRAが行なう。
証明書に関する責任はCACAnetのCAと各RAが分担することになる。
この分担の境界は、証明書のライフサイクルアプローチ(ベリサインCPSなどを参照)
つまり次のような流れの中で、ここまではRAの分担でここからここまではCAの分担と
いう具合に決定されるものになるでしょう。
「証明書申請」→「証明書申請の検査」→「証明書の発行」→「加入者による証明書
の承認」→「証明書の使用」→「証明書の効力停止と廃棄」→「証明書の期間満了と
更新」→(最初にもどる)
(RAとしては、「**医師会」のような法人格を持たない任意団体も含められるよう
にすることを想定しています)
■運営の透明性
NPOの認証局のCACAnetの信頼性は損害補償のような形ではなく、運営の透明性と参加
可能性にあるというアプローチを想定しています。
プライバシー保護とセキュリティ上の問題になる部分を明確に定義したうえで、かな
り徹底した運営情報の公開を考えています。公開するものにはソースコードやサービ
スのスクリプトなども含まれる予定です。
■CAのCPSとRAのCPSの分離
以上のような原則から、CAの証明書には、CACAnetのCAのCPSが記載(リンク)されま
すが、実際にRAから発行されるサーバー証明書やユーザー証明書の中に記載(リンク)
されるCPSは、それを発行したRAのCPSになります。
■RFC2459に可能なかぎり準拠する
現状のクライアントやサーバーの実装よりもとにかくRFCの記載に忠実な証明書とい
うものを作ってみる。それでどうしても問題があるなら現状に合わせた譲歩を行なう。
■CACAnetのOID
CACAnetが電信電話技術委員会(TTC)か取得したOIDは、「0.2.440.200092」です。
■CACAnetのOIDの意味付け
CACAnetのCAのCPSを
CACAnetCACPS=0.2.440.200092.1.1.1
CACAnetのCAのCRLを
CACAnetCACRL=0.2.440.200092.1.1.1.1
CACAnetと関連するRAなどのCPSは、
CPS連番=${CACAnetOID}.1.1.連番
■CACAnetの証明書の構造
CACAnetの証明書における各フィールドの定義
1)証明書内の標準フィールド
1−1)version
X.509証明書バージョン番号は3(このフィールドの値は"2")
1−2)serialNumber
CACAnetは1から順次インクリメントして採番する。
1−3)signature
RSA+md5 を使用する。
1−4)issuer
証明書発行者のDN
"cn=CACAnet CA,ou=CA,o=CACAnet Fukuoka,c=JP"
を最上位のCAとする。
1−5)validity
CACAnetで当初想定するEntityは以下のものである。
鍵長 有効期間
・CA 2048bits 5years
・SSL Server Certificate 1024bits 1year
・S/MIME USR Certificate 1024bits 1year
1−6)subject
CACAnetで当初想定するEntityは以下のものである。
・CA cn=CACAnet CA,ou=CA,o=CACAnet,c=JP
・SSL Server Certificate dcのみ→ cnでDNS
・S/MIME USR Certificate emailAddress=*,cn=*,ou="RA Name",o=CACAnet,c=JP
1−7)subjectPublicKeyInfo
公開鍵データ。RSAを使用する。
1−8)issuerUniqueID
CACAnetではこのフィールドを使用しない。
1−9)subjectUniqueID
CACAnetではこのフィールドを使用しない。
2)エクステンションフィールド
Extensions ::= SEQUENCE SIZE (1..MAX) OF Extension
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
2−1)Authority Key Identifier
2−1−1)keyIdentifierの決定法
subjectPublicKeyを160bitのSHA-1 hssh関数にかけて生成。
2−1−2)authorityCertIssuer
"cn=CACAnet CA,ou=CA,o=CACAnet,c=JP"
2−1−3)authorityCertSerialNumber
"ou=CA,o=CACAnet,c=JP"の証明書のシリアルナンバー
2−2)Basic Constraints
CA("ou=CA,o=CACAnet,c=JP")の証明書において、pathLenConstraintsを2に設定。
critical設定。
#将来的に相互認証のハブになれるようにするためパス長を2にしている。
id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::= { id-ce 35 }
AuthorityKeyIdentifier ::= SEQUENCE {
keyIdentifier [0] KeyIdentifier OPTIONAL,
authorityCertIssuer [1] GeneralNames OPTIONAL,
authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL }
KeyIdentifier ::= OCTET STRING
2−3)Key Usage
・CA
Key Usage:
keyCertSign
cRLSign
critical設定
Extended Key Usage:
CA証明書の場合は無し
・SSL Server Certificate
Key Usage:
digitalSignature
nonRepudiation
keyEncipherment
keyAgreement
critical設定
Extended Key Usage:
id-kp-serverAuth OBJECT IDENTIFIER ::= {id-kp 1}
id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 }
critical設定
・S/MIME USR Certificate
Key Usage:
digitalSignature
nonRepudiation
keyEncipherment
dataEncipherment
keyAgreement
critical設定
Extended Key Usage:
id-kp-clientAuth OBJECT IDENTIFIER ::= {id-kp 2}
id-kp-codeSigning OBJECT IDENTIFIER ::= {id-kp 3}
id-kp-emailProtection OBJECT IDENTIFIER ::= {id-kp 4}
id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 }
critical設定
id-ce-keyUsage OBJECT IDENTIFIER ::= { id-ce 15 }
KeyUsage ::= BIT STRING {
digitalSignature (0),
nonRepudiation (1),
keyEncipherment (2),
dataEncipherment (3),
keyAgreement (4),
keyCertSign (5),
cRLSign (6),
encipherOnly (7),
decipherOnly (8) }
2−4)Certificate Policies
id-ce-certificatePolicies OBJECT IDENTIFIER ::= { id-ce 32 }
certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
PolicyInformation ::= SEQUENCE {
policyIdentifier CertPolicyId,
policyQualifiers SEQUENCE SIZE (1..MAX) OF
PolicyQualifierInfo OPTIONAL }
CertPolicyId ::= OBJECT IDENTIFIER
PolicyQualifierInfo ::= SEQUENCE {
policyQualifierId PolicyQualifierId,
qualifier ANY DEFINED BY policyQualifierId }
-- policyQualifierIds for Internet policy qualifiers
id-qt OBJECT IDENTIFIER ::= { id-pkix 2 }
id-qt-cps OBJECT IDENTIFIER ::= { id-qt 1 }
id-qt-unotice OBJECT IDENTIFIER ::= { id-qt 2 }
PolicyQualifierId ::=
OBJECT IDENTIFIER ( id-qt-cps | id-qt-unotice )
Qualifier ::= CHOICE {
cPSuri CPSuri,
userNotice UserNotice }
CPSuri ::= IA5String
http://www.cacanet.org/CPS/cps2000-CACAnetCA.html
UserNotice ::= SEQUENCE {
noticeRef NoticeReference OPTIONAL,
explicitText DisplayText OPTIONAL}
NoticeReference ::= SEQUENCE {
organization DisplayText,
noticeNumbers SEQUENCE OF INTEGER }
DisplayText ::= CHOICE {
visibleString VisibleString (SIZE (1..200)),
bmpString BMPString (SIZE (1..200)),
utf8String UTF8String (SIZE (1..200)) }
200バイト以内だと、「発行された証明書の信頼度はRAの運用規定書に依存する。
RAの運用規定書はCACAnetによってレビューされる。」でぎりぎりです。
UTF8で書くと、openssl が食べてくれるかな?
2−5)Policy Mappings
CACAnetではこのフィールドを使用しない。
現時点では、Mappingを行う対象がないため、このフィールドは設定しない。
2−6)Subject Alternative Name
CACAnetで当初想定するEntityは以下のものである。
・CA このフィールドを使用しない。
・SSL Server Certificate このフィールドにdNSNameを書き込む
・S/MIME USR Certificate このフィールドにRFC822Nameを書き込む
id-ce-subjectAltName OBJECT IDENTIFIER ::= { id-ce 17 }
SubjectAltName ::= GeneralNames
GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
GeneralName ::= CHOICE {
otherName [0] OtherName,
rfc822Name [1] IA5String,
dNSName [2] IA5String,
x400Address [3] ORAddress,
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING,
registeredID [8] OBJECT IDENTIFIER}
OtherName ::= SEQUENCE {
type-id OBJECT IDENTIFIER,
value [0] EXPLICIT ANY DEFINED BY type-id }
EDIPartyName ::= SEQUENCE {
nameAssigner [0] DirectoryString OPTIONAL,
partyName [1] DirectoryString }
2−7)Issuer Alternative Names
CACAnetではこのフィールドを使用しない。
2−8)Subject Directory Attributes
CACAnetではこのフィールドを使用しない。
2−9)Name Constraints
CACAnetではこのフィールドを使用しない。
2−10)Policy Constraints
requierExplicitPolicyフィールドを使用。
CACAnetの証明書のpathLenConstraintsが2であるので、3にするのが適当?
id-ce-policyConstraints OBJECT IDENTIFIER ::= { id-ce 36 }
PolicyConstraints ::= SEQUENCE {
requireExplicitPolicy [0] SkipCerts OPTIONAL,
inhibitPolicyMapping [1] SkipCerts OPTIONAL }
SkipCerts ::= INTEGER (0..MAX)
2−11)Extended key usage
Key Usageとセットで使用。
id-ce-extKeyUsage OBJECT IDENTIFIER ::= {id-ce 37}
ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId
KeyPurposeId ::= OBJECT IDENTIFIER
id-kp OBJECT IDENTIFIER ::= { id-pkix 3 }
id-kp-serverAuth OBJECT IDENTIFIER ::= {id-kp 1}
-- TLS Web server authentication
-- Key usage bits that may be consistent: digitalSignature,
-- keyEncipherment or keyAgreement
--
id-kp-clientAuth OBJECT IDENTIFIER ::= {id-kp 2}
-- TLS Web client authentication
-- Key usage bits that may be consistent: digitalSignature and/or
-- keyAgreement
--
id-kp-codeSigning OBJECT IDENTIFIER ::= {id-kp 3}
-- Signing of downloadable executable code
-- Key usage bits that may be consistent: digitalSignature
--
id-kp-emailProtection OBJECT IDENTIFIER ::= {id-kp 4}
-- E-mail protection
-- Key usage bits that may be consistent: digitalSignature,
-- nonRepudiation, and/or (keyEncipherment
-- or keyAgreement)
--
id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 }
-- Binding the hash of an object to a time from an agreed-upon time
-- source. Key usage bits that may be consistent: digitalSignature,
-- nonRepudiation
2−12)CRL Distribution Points
LDAP schemeで指定する。
→ opensslの問題により、httpスキーマに変更?
id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::= { id-ce 31 }
cRLDistributionPoints ::= {
CRLDistPointsSyntax }
CRLDistPointsSyntax ::= SEQUENCE SIZE (1..MAX) OF DistributionPoint
DistributionPoint ::= SEQUENCE {
distributionPoint [0] DistributionPointName OPTIONAL,
reasons [1] ReasonFlags OPTIONAL,
cRLIssuer [2] GeneralNames OPTIONAL }
DistributionPointName ::= CHOICE {
fullName [0] GeneralNames,
nameRelativeToCRLIssuer [1] RelativeDistinguishedName }
ReasonFlags ::= BIT STRING {
unused (0),
keyCompromise (1),
cACompromise (2),
affiliationChanged (3),
superseded (4),
cessationOfOperation (5),
certificateHold (6) }
2−13)Private Internet Extensions
2−13−1)Authority Information Access
CACAnetではこのフィールドを使用しない。
--
/| (
/ | (
/ | -_ * (
/ | - (
/____| ( Shigeichiro Yamasaki
y--------/ (
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
山崎です。
CACAnetの証明書のテストページができました。
#花田さんに感謝。
[https://www2.cacanet.org:9443/] です。
個人証明書の組み込み用パスワードは cacanet です。
ます、テスト用のCA証明書を組み込んでからチェックをお願いします。
以前のメールで書きましたように、RFC2459に可能なかぎり準拠した形式になってい
ます。「過激なくらいまともな証明書」です。
nsCertTypeなどのネットスケープ固有のエクステンションも一切入れていません。
一点だけ、前回のメールで書いた設定から変っています。extendedKeyUsage をクリ
ティカルでなくしました。他は変っていません。
古いブラウザでうまく動くかどうか心配ですので、前回と同様にぜひ皆さまの環境で
チェックしてみてください。よろしくお願いします。
ある程度の環境でうまく動くようでしたら、この証明書の設定で本物のCACAnetの認
証局の証明書やサーバー証明書、ユーザー証明書を作成したいと思います。
どれくらいの「古いブラウザ」を切り捨てるかということは、議論をして決定したい
と思います。
現在のところ、次の環境でサーバー認証が正常に行えることが確認されています。
IE5(128bit) on Windows NT
IE5(56bit) on Windows98
Netscape 4.72 on Windows NT
Netscape 4.7 on Solaris2.5.1
また、次の環境でクライアント認証まで正常にできることが確認されています。
Netscape Communicator 4.7 on MacOS J1 8.6:正常
Netscape Navigator 4.61 on LINUX 正常
#証明書の中にCPSなどのポインタが埋め込まれていますが、まだ完成していないの
で、ダミーです。CRLも同様です。
--
/| (
/ | (
/ | -_ * (
/ | - ( Shigeichiro Yamasaki
/____| (
y--------/ ( http://www.cacanet.org/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~