發表日期:2018-09 文章編輯:小燈 瀏覽次數:2188
https://docs.corda.net/permissioning.html
Corda 是一種聯盟鏈技術,聯盟鏈一般也被稱為許可鏈,這意味著每個節點都需要唯一的身份。在生產環境的網絡中,每個準入的節點都應該經過嚴格的KYC(Know Your Customer)審查流程,才能夠獲取唯一的被認可的身份。這個身份在Corda網絡中使用數字證書標識。
在技術上,一個Corda節點為了接入聯盟網絡,需要在安裝節點的時候包含兩個keystore文件和一個truststore文件。這些文件都被放置在節點的certificates/目錄下。
從Corda的設計中不難看出,它的身份體系是構建在PKI之上。其中truststore.jks代表了Root CA,nodekeystore.jks表示Node CA以及Well-Known identity,而sslkeystore.jks存儲了TLS certificate.
在開發模式下,即節點的配置文件 node.conf 中devMode=true,如果nodekeystore.jks和sslkeystore.jks不存在,節點啟動時會自動生成。這樣設計的初衷是為了讓開發者快速驗證,但同時也會導致對生產要求的忽視。
幾乎所有企業都有一套自己完善的證書管理機制和審批流程,所以利用現有的機制和流程加固證書安全也是一項不容忽視的任務。這也是我們選用Corda的原因之一 —— 充分利用現有的基礎設施。
理想的情況下,企業的cert部門會包攬上圖中所有的任務,每個節點需要做的事情就是提交CSR(Certificate Signing Request)文件,然后等待一封郵件,附件中包含申請的數字證書、中間CA(Intermediated CA)證書和根CA(Root CA)證書。
當然更理想的情況是,Doorman(見上圖)這個服務正式上線。而事實上,Corda3.2以及預覽版的企業版Corda都還沒有Doorman服務的實現,官方文檔中還只有一套不成熟的REST接口標準。為啥說它不成熟呢?因為這個接口標準在release-M14.0還存在,但是最新的Corda3.2卻不見了蹤影。
Request method | Path | Description |
---|---|---|
POST | /api/certificate | Create new certificate request record and stored for further approval process, server will response with a request ID if the request has been accepted. |
GET | /api/certificate/{requestId} | Retrieve certificates for requestId, the server will return HTTP 204 if request is not yet approved or HTTP 401 if it has been rejected. |
遺憾的是,我們不太可能在開發階段直接找企業的cert部門給我簽發證書。為了盡早驗證集成企業的證書簽發體系,我們可以先模擬企業的Root CA簽發節點的證書。
首先使用rsa算法生成3072位長度的私鑰。
openssl genrsa -des3 -passout pass:x -out ca.pass.key 3072-> Generating RSA private key, 3072 bit long modulus ....................++ ............................................................................................++ e is 65537 (0x10001)
為什么要求私鑰的key size是3072呢?因為Corda文檔中有明確的要求:
The root network CA, doorman CA and node CA keys, as well as the node TLS keys, must follow one of the following schemes:
- ECDSA using the NIST P-256 curve (secp256r1)
- RSA with 3072-bit key size
在橢圓曲線簽名算法(ECDSA)和RSA算法兩者選擇其一,而RSA算法要求私鑰的長度必須是3072位。
openssl rsa -passin pass:x -in ca.pass.key -out ca.key-> writing RSA key
上面生成的私鑰是有passphase的,這一步就是將原來的passphasepass:x
從ca.pass.key文件中去除,得到ca.key文件,方便接下來直接使用明文的私鑰。
openssl req -new -key ca.key -out ca.csr \ -subj '/C=US/ST=California/L=Los Angeles/O=Mystic Coders, LLC/ \ OU=Information Technology/CN=ws.mysticcoders.com \ emailAddress=fakeemail AT gmail DOT com/ \ subjectAltName=DNS.1=endpoint.com'->Subject Attribute OU has no known NID, skipped Subject Attribute subjectAltName has no known NID, skipped
當執行完這一步,當前目錄下會出現三個文件:ca.csr, ca.key, ca.pass.key。其中ca.csr文件(Certificate Signing Request)是待簽發的證書請求文件。
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt-> Signature ok subject=/C=US/ST=California/L=Los Angeles/O=Mystic Coders, LLC/CN=ws.mysticcoders.com \x0AemailAddress=fakeemail AT gmail DOT com Getting Private key
這步操作結束之后,ca.crt文件就順利生成,它代表了Root CA的證書。我們接下來就能利用這個證書及其私鑰簽發SSL證書和Node Well-Known identity 證書。
這里以生成Corda必需的sslkeystore.jks文件為例,Corda對此給出了幾點標準要求:
Creating the node TLS keystores
- For each node, create a new keypair
- Create a certificate for the keypair signed with the node CA key. The basic constraints extension must be set to
false
- Create a new Java keystore named
sslkeystore.jks
and store the key and certificates in it using the aliascordaclienttls
- The node will store this keystore locally to sign its TLS certificates
keytool -genkeypair -alias cordaclienttls -keyalg RSA-ext BC=ca:FALSE -keysize 3072 -keystore sslkeystore.jks -storepass changeit -v-> ... Generating 3,072 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 90 days for: CN=Qian, OU=Software engineer, O=ThoughtWorks, L=Chengdu, ST=Sichuan, C=CN Enter key password for <cordaclienttls> (RETURN if same as keystore password): [Storing sslkeystore.jks]
特別要注意的是-ext BC=ca:FALSE
,Corda文檔中著重強調
查看sslkeystore.jks,可以使用下面的命令
keytool -list -v -keystore sslkeystore.jks
keystore文件和私鑰產生之后,就想傳統向CA機構提交申請一樣,需要準備CSR文件。
keytool -certreq -alias cordaclienttls -keystore sslkeystore.jks -file sslkeystore.csr -v-> Enter keystore password: Certification request stored in file <sslkeystore.csr> Submit this to your CA
keytool的這條命令指定sslkeystore.jks文件中別名為cordaclienttls
的entry產生對應的sslkeystore.csr文件。
查看sslkeystore.csr中的內容,可以使用下面的命令
openssl req -in sslkeystore.csr -noout -text
正如標題所示,從CA機構獲取證書是比較正式的做法。著重強調,證書的安全性非常重要。這里使用模擬的Root CA簽發只是為了驗證假設的可行性,這個假設就是Corda的證書體系可以融合企業現存的證書體系。
openssl x509 -req -days 365 -in sslkeystore.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out sslkeystore.crt-> Signature ok subject=/C=CN/ST=Sichuan/L=Chengdu/O=ThoughtWorks/OU=Software sector/CN=Yan Qian Getting CA Private Key
根證書一般不會直接用于簽發數字證書的,總會存在Intermediate CA給使用者簽發,這樣做的目的是保證根證書的安全??偟膩碚f,使用頻率越少,出現失誤的可能性就越小。而且從證書的信任鏈角度考慮,根證書是PKI體系信任的源頭,一旦遭遇破壞,整個信任體系就得崩潰,后果很嚴重。
keytool -importcert -trustcacerts -alias cordarootca -file ca.crt -keystore sslkeystore.jks
如果真的有中間CA的證書,同樣也需要導入到這個keystore文件。
keytool -importcert -trustcacerts -alias cordaintermediateca -file Intermediateca.crt -keystore sslkeystore.jks
keytool -importcert -alias cordaclienttls -file sslkeystore.crt -keystore sslkeystore.jks
注意這一步操作,如果根證書沒有事先導入,會出現下面的錯誤
Enter keystore password: keytool error: java.lang.Exception: Public keys in reply and keystore don't match
解決方法是提前導入Root CA和Intermediate CA(如果有的話)的證書。
此時,查看sslkeystore.jks的內容
keytool -list -v -keystore sslkeystore.jks-> Enter keystore password: Keystore type: JKS Keystore provider: SUNYour keystore contains 2 entriesAlias name: cordaclienttls Creation date: Sep 26, 2018 Entry type: PrivateKeyEntry Certificate chain length: 2 Certificate[1]: Owner: CN=Yan Qian, OU=Software sector, O=ThoughtWorks, L=Chengdu, ST=Sichuan, C=CN Issuer: CN="ws.mysticcoders.com ... Certificate[2]: Owner: CN="ws.mysticcoders.com ... Alias name: cordarootca Creation date: Sep 27, 2018 Entry type: trustedCertEntry
這個文件包含了兩個entry,一個是cordaclienttls
,另一個就是cordarootca
。注意其中cordaclienttls
的Entry type是PrivateKeyEntry,而cordarootca
的Entry type是trustedCertEntry。keystore文件除了存儲證書之外,也可以存儲私鑰(這也是很多人詬病Corda的地方,私鑰理應離線存儲,不過Corda官方也有自己的解釋)。另外,cordaclienttls
的證書鏈長度為2,從自己的證書上溯到根證書。
keytool -importcert -trustcacerts -alias cordarootca -file ca.crt -keystore truststore.jks
keystore和truststore的文件格式是一致的,之所以劃分成keystore和truststore,只是在概念上做了區分。Truststore決定是否信任遠程的認證信息,Keystore則決定哪個認證信息可以被發送到遠端。簡而言之,truststore是CA證書的本地存儲,類似于瀏覽器中的根證書;keystore是身份和對應private key的存儲,類似服務端的ssl數字證書和private key。
每個節點都需要將下面的文件拷貝到自己的證書目錄,即<workspace>/certificates/
于2018-09-26
參考鏈接
[1] keystore和truststore的區別
日期:2018-04 瀏覽次數:6761
日期:2017-02 瀏覽次數:3435
日期:2017-09 瀏覽次數:3656
日期:2017-12 瀏覽次數:3526
日期:2018-12 瀏覽次數:4816
日期:2016-12 瀏覽次數:4582
日期:2017-07 瀏覽次數:13642
日期:2017-12 瀏覽次數:3505
日期:2018-06 瀏覽次數:4265
日期:2018-05 瀏覽次數:4444
日期:2017-12 瀏覽次數:3556
日期:2017-06 瀏覽次數:3979
日期:2018-01 瀏覽次數:3941
日期:2016-12 瀏覽次數:3908
日期:2018-08 瀏覽次數:4423
日期:2017-12 瀏覽次數:3706
日期:2016-09 瀏覽次數:6404
日期:2018-07 瀏覽次數:3206
日期:2016-12 瀏覽次數:3230
日期:2018-10 瀏覽次數:3378
日期:2018-10 瀏覽次數:3479
日期:2018-09 瀏覽次數:3577
日期:2018-02 瀏覽次數:3595
日期:2015-05 瀏覽次數:3519
日期:2018-09 瀏覽次數:3305
日期:2018-06 瀏覽次數:3433
日期:2017-02 瀏覽次數:3869
日期:2018-02 瀏覽次數:4334
日期:2018-02 瀏覽次數:4173
日期:2016-12 瀏覽次數:3571
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.