為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2018-09 文章編輯:小燈 瀏覽次數(shù):2216
https://docs.corda.net/permissioning.html
Corda 是一種聯(lián)盟鏈技術(shù),聯(lián)盟鏈一般也被稱為許可鏈,這意味著每個節(jié)點(diǎn)都需要唯一的身份。在生產(chǎn)環(huán)境的網(wǎng)絡(luò)中,每個準(zhǔn)入的節(jié)點(diǎn)都應(yīng)該經(jīng)過嚴(yán)格的KYC(Know Your Customer)審查流程,才能夠獲取唯一的被認(rèn)可的身份。這個身份在Corda網(wǎng)絡(luò)中使用數(shù)字證書標(biāo)識。
在技術(shù)上,一個Corda節(jié)點(diǎn)為了接入聯(lián)盟網(wǎng)絡(luò),需要在安裝節(jié)點(diǎn)的時候包含兩個keystore文件和一個truststore文件。這些文件都被放置在節(jié)點(diǎn)的certificates/目錄下。
從Corda的設(shè)計中不難看出,它的身份體系是構(gòu)建在PKI之上。其中truststore.jks代表了Root CA,nodekeystore.jks表示Node CA以及Well-Known identity,而sslkeystore.jks存儲了TLS certificate.
在開發(fā)模式下,即節(jié)點(diǎn)的配置文件 node.conf 中devMode=true,如果nodekeystore.jks和sslkeystore.jks不存在,節(jié)點(diǎn)啟動時會自動生成。這樣設(shè)計的初衷是為了讓開發(fā)者快速驗證,但同時也會導(dǎo)致對生產(chǎn)要求的忽視。
幾乎所有企業(yè)都有一套自己完善的證書管理機(jī)制和審批流程,所以利用現(xiàn)有的機(jī)制和流程加固證書安全也是一項不容忽視的任務(wù)。這也是我們選用Corda的原因之一 —— 充分利用現(xiàn)有的基礎(chǔ)設(shè)施。
理想的情況下,企業(yè)的cert部門會包攬上圖中所有的任務(wù),每個節(jié)點(diǎn)需要做的事情就是提交CSR(Certificate Signing Request)文件,然后等待一封郵件,附件中包含申請的數(shù)字證書、中間CA(Intermediated CA)證書和根CA(Root CA)證書。
當(dāng)然更理想的情況是,Doorman(見上圖)這個服務(wù)正式上線。而事實(shí)上,Corda3.2以及預(yù)覽版的企業(yè)版Corda都還沒有Doorman服務(wù)的實(shí)現(xiàn),官方文檔中還只有一套不成熟的REST接口標(biāo)準(zhǔn)。為啥說它不成熟呢?因為這個接口標(biāo)準(zhǔn)在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. |
遺憾的是,我們不太可能在開發(fā)階段直接找企業(yè)的cert部門給我簽發(fā)證書。為了盡早驗證集成企業(yè)的證書簽發(fā)體系,我們可以先模擬企業(yè)的Root CA簽發(fā)節(jié)點(diǎn)的證書。
首先使用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
當(dāng)執(zhí)行完這一步,當(dāng)前目錄下會出現(xiàn)三個文件:ca.csr, ca.key, ca.pass.key。其中ca.csr文件(Certificate Signing Request)是待簽發(fā)的證書請求文件。
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
這步操作結(jié)束之后,ca.crt文件就順利生成,它代表了Root CA的證書。我們接下來就能利用這個證書及其私鑰簽發(fā)SSL證書和Node Well-Known identity 證書。
這里以生成Corda必需的sslkeystore.jks文件為例,Corda對此給出了幾點(diǎn)標(biāo)準(zhǔn)要求:
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文檔中著重強(qiáng)調(diào)
查看sslkeystore.jks,可以使用下面的命令
keytool -list -v -keystore sslkeystore.jks
keystore文件和私鑰產(chǎn)生之后,就想傳統(tǒng)向CA機(jī)構(gòu)提交申請一樣,需要準(zhǔn)備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產(chǎn)生對應(yīng)的sslkeystore.csr文件。
查看sslkeystore.csr中的內(nèi)容,可以使用下面的命令
openssl req -in sslkeystore.csr -noout -text
正如標(biāo)題所示,從CA機(jī)構(gòu)獲取證書是比較正式的做法。著重強(qiáng)調(diào),證書的安全性非常重要。這里使用模擬的Root CA簽發(fā)只是為了驗證假設(shè)的可行性,這個假設(shè)就是Corda的證書體系可以融合企業(yè)現(xiàn)存的證書體系。
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
根證書一般不會直接用于簽發(fā)數(shù)字證書的,總會存在Intermediate CA給使用者簽發(fā),這樣做的目的是保證根證書的安全。總的來說,使用頻率越少,出現(xiàn)失誤的可能性就越小。而且從證書的信任鏈角度考慮,根證書是PKI體系信任的源頭,一旦遭遇破壞,整個信任體系就得崩潰,后果很嚴(yán)重。
keytool -importcert -trustcacerts -alias cordarootca -file ca.crt -keystore sslkeystore.jks
如果真的有中間CA的證書,同樣也需要導(dǎo)入到這個keystore文件。
keytool -importcert -trustcacerts -alias cordaintermediateca -file Intermediateca.crt -keystore sslkeystore.jks
keytool -importcert -alias cordaclienttls -file sslkeystore.crt -keystore sslkeystore.jks
注意這一步操作,如果根證書沒有事先導(dǎo)入,會出現(xiàn)下面的錯誤
Enter keystore password: keytool error: java.lang.Exception: Public keys in reply and keystore don't match
解決方法是提前導(dǎo)入Root CA和Intermediate CA(如果有的話)的證書。
此時,查看sslkeystore.jks的內(nèi)容
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的地方,私鑰理應(yīng)離線存儲,不過Corda官方也有自己的解釋)。另外,cordaclienttls
的證書鏈長度為2,從自己的證書上溯到根證書。
keytool -importcert -trustcacerts -alias cordarootca -file ca.crt -keystore truststore.jks
keystore和truststore的文件格式是一致的,之所以劃分成keystore和truststore,只是在概念上做了區(qū)分。Truststore決定是否信任遠(yuǎn)程的認(rèn)證信息,Keystore則決定哪個認(rèn)證信息可以被發(fā)送到遠(yuǎn)端。簡而言之,truststore是CA證書的本地存儲,類似于瀏覽器中的根證書;keystore是身份和對應(yīng)private key的存儲,類似服務(wù)端的ssl數(shù)字證書和private key。
每個節(jié)點(diǎn)都需要將下面的文件拷貝到自己的證書目錄,即<workspace>/certificates/
于2018-09-26
參考鏈接
[1] keystore和truststore的區(qū)別
日期:2018-04 瀏覽次數(shù):6794
日期:2017-02 瀏覽次數(shù):3475
日期:2017-09 瀏覽次數(shù):3698
日期:2017-12 瀏覽次數(shù):3562
日期:2018-12 瀏覽次數(shù):4865
日期:2016-12 瀏覽次數(shù):4614
日期:2017-07 瀏覽次數(shù):13671
日期:2017-12 瀏覽次數(shù):3545
日期:2018-06 瀏覽次數(shù):4296
日期:2018-05 瀏覽次數(shù):4481
日期:2017-12 瀏覽次數(shù):3585
日期:2017-06 瀏覽次數(shù):4011
日期:2018-01 瀏覽次數(shù):3973
日期:2016-12 瀏覽次數(shù):3942
日期:2018-08 瀏覽次數(shù):4457
日期:2017-12 瀏覽次數(shù):3755
日期:2016-09 瀏覽次數(shù):6494
日期:2018-07 瀏覽次數(shù):3242
日期:2016-12 瀏覽次數(shù):3258
日期:2018-10 瀏覽次數(shù):3412
日期:2018-10 瀏覽次數(shù):3518
日期:2018-09 瀏覽次數(shù):3605
日期:2018-02 瀏覽次數(shù):3627
日期:2015-05 瀏覽次數(shù):3554
日期:2018-09 瀏覽次數(shù):3339
日期:2018-06 瀏覽次數(shù):3463
日期:2017-02 瀏覽次數(shù):3902
日期:2018-02 瀏覽次數(shù):4360
日期:2018-02 瀏覽次數(shù):4220
日期:2016-12 瀏覽次數(shù):3607
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.