為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴
發(fā)表日期:2018-09 文章編輯:小燈 瀏覽次數(shù):2197
https://docs.corda.net/permissioning.html
Corda 是一種聯(lián)盟鏈技術(shù),聯(lián)盟鏈一般也被稱為許可鏈,這意味著每個(gè)節(jié)點(diǎn)都需要唯一的身份。在生產(chǎn)環(huán)境的網(wǎng)絡(luò)中,每個(gè)準(zhǔn)入的節(jié)點(diǎn)都應(yīng)該經(jīng)過(guò)嚴(yán)格的KYC(Know Your Customer)審查流程,才能夠獲取唯一的被認(rèn)可的身份。這個(gè)身份在Corda網(wǎng)絡(luò)中使用數(shù)字證書標(biāo)識(shí)。
在技術(shù)上,一個(gè)Corda節(jié)點(diǎn)為了接入聯(lián)盟網(wǎng)絡(luò),需要在安裝節(jié)點(diǎn)的時(shí)候包含兩個(gè)keystore文件和一個(gè)truststore文件。這些文件都被放置在節(jié)點(diǎn)的certificates/目錄下。
從Corda的設(shè)計(jì)中不難看出,它的身份體系是構(gòu)建在PKI之上。其中truststore.jks代表了Root CA,nodekeystore.jks表示Node CA以及Well-Known identity,而sslkeystore.jks存儲(chǔ)了TLS certificate.
在開發(fā)模式下,即節(jié)點(diǎn)的配置文件 node.conf 中devMode=true,如果nodekeystore.jks和sslkeystore.jks不存在,節(jié)點(diǎn)啟動(dòng)時(shí)會(huì)自動(dòng)生成。這樣設(shè)計(jì)的初衷是為了讓開發(fā)者快速驗(yàn)證,但同時(shí)也會(huì)導(dǎo)致對(duì)生產(chǎn)要求的忽視。
幾乎所有企業(yè)都有一套自己完善的證書管理機(jī)制和審批流程,所以利用現(xiàn)有的機(jī)制和流程加固證書安全也是一項(xiàng)不容忽視的任務(wù)。這也是我們選用Corda的原因之一 —— 充分利用現(xiàn)有的基礎(chǔ)設(shè)施。
理想的情況下,企業(yè)的cert部門會(huì)包攬上圖中所有的任務(wù),每個(gè)節(jié)點(diǎn)需要做的事情就是提交CSR(Certificate Signing Request)文件,然后等待一封郵件,附件中包含申請(qǐng)的數(shù)字證書、中間CA(Intermediated CA)證書和根CA(Root CA)證書。
當(dāng)然更理想的情況是,Doorman(見上圖)這個(gè)服務(wù)正式上線。而事實(shí)上,Corda3.2以及預(yù)覽版的企業(yè)版Corda都還沒(méi)有Doorman服務(wù)的實(shí)現(xiàn),官方文檔中還只有一套不成熟的REST接口標(biāo)準(zhǔn)。為啥說(shuō)它不成熟呢?因?yàn)檫@個(gè)接口標(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àn)證集成企業(yè)的證書簽發(fā)體系,我們可以先模擬企業(yè)的Root CA簽發(fā)節(jié)點(diǎn)的證書。
首先使用rsa算法生成3072位長(zhǎng)度的私鑰。
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呢?因?yàn)镃orda文檔中有明確的要求:
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算法要求私鑰的長(zhǎng)度必須是3072位。
openssl rsa -passin pass:x -in ca.pass.key -out ca.key-> writing RSA key
上面生成的私鑰是有passphase的,這一步就是將原來(lái)的passphasepass:x
從ca.pass.key文件中去除,得到ca.key文件,方便接下來(lái)直接使用明文的私鑰。
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)前目錄下會(huì)出現(xiàn)三個(gè)文件:ca.csr, ca.key, ca.pass.key。其中ca.csr文件(Certificate Signing Request)是待簽發(fā)的證書請(qǐng)求文件。
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的證書。我們接下來(lái)就能利用這個(gè)證書及其私鑰簽發(fā)SSL證書和Node Well-Known identity 證書。
這里以生成Corda必需的sslkeystore.jks文件為例,Corda對(duì)此給出了幾點(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)提交申請(qǐng)一樣,需要準(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)生對(duì)應(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ā)只是為了驗(yàn)證假設(shè)的可行性,這個(gè)假設(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
根證書一般不會(huì)直接用于簽發(fā)數(shù)字證書的,總會(huì)存在Intermediate CA給使用者簽發(fā),這樣做的目的是保證根證書的安全??偟膩?lái)說(shuō),使用頻率越少,出現(xiàn)失誤的可能性就越小。而且從證書的信任鏈角度考慮,根證書是PKI體系信任的源頭,一旦遭遇破壞,整個(gè)信任體系就得崩潰,后果很嚴(yán)重。
keytool -importcert -trustcacerts -alias cordarootca -file ca.crt -keystore sslkeystore.jks
如果真的有中間CA的證書,同樣也需要導(dǎo)入到這個(gè)keystore文件。
keytool -importcert -trustcacerts -alias cordaintermediateca -file Intermediateca.crt -keystore sslkeystore.jks
keytool -importcert -alias cordaclienttls -file sslkeystore.crt -keystore sslkeystore.jks
注意這一步操作,如果根證書沒(méi)有事先導(dǎo)入,會(huì)出現(xiàn)下面的錯(cuò)誤
Enter keystore password: keytool error: java.lang.Exception: Public keys in reply and keystore don't match
解決方法是提前導(dǎo)入Root CA和Intermediate CA(如果有的話)的證書。
此時(shí),查看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
這個(gè)文件包含了兩個(gè)entry,一個(gè)是cordaclienttls
,另一個(gè)就是cordarootca
。注意其中cordaclienttls
的Entry type是PrivateKeyEntry,而cordarootca
的Entry type是trustedCertEntry。keystore文件除了存儲(chǔ)證書之外,也可以存儲(chǔ)私鑰(這也是很多人詬病Corda的地方,私鑰理應(yīng)離線存儲(chǔ),不過(guò)Corda官方也有自己的解釋)。另外,cordaclienttls
的證書鏈長(zhǎng)度為2,從自己的證書上溯到根證書。
keytool -importcert -trustcacerts -alias cordarootca -file ca.crt -keystore truststore.jks
keystore和truststore的文件格式是一致的,之所以劃分成keystore和truststore,只是在概念上做了區(qū)分。Truststore決定是否信任遠(yuǎn)程的認(rèn)證信息,Keystore則決定哪個(gè)認(rèn)證信息可以被發(fā)送到遠(yuǎn)端。簡(jiǎn)而言之,truststore是CA證書的本地存儲(chǔ),類似于瀏覽器中的根證書;keystore是身份和對(duì)應(yīng)private key的存儲(chǔ),類似服務(wù)端的ssl數(shù)字證書和private key。
每個(gè)節(jié)點(diǎn)都需要將下面的文件拷貝到自己的證書目錄,即<workspace>/certificates/
于2018-09-26
參考鏈接
[1] keystore和truststore的區(qū)別
日期:2018-04 瀏覽次數(shù):6776
日期:2017-02 瀏覽次數(shù):3451
日期:2017-09 瀏覽次數(shù):3676
日期:2017-12 瀏覽次數(shù):3544
日期:2018-12 瀏覽次數(shù):4842
日期:2016-12 瀏覽次數(shù):4594
日期:2017-07 瀏覽次數(shù):13659
日期:2017-12 瀏覽次數(shù):3522
日期:2018-06 瀏覽次數(shù):4279
日期:2018-05 瀏覽次數(shù):4456
日期:2017-12 瀏覽次數(shù):3569
日期:2017-06 瀏覽次數(shù):3995
日期:2018-01 瀏覽次數(shù):3958
日期:2016-12 瀏覽次數(shù):3923
日期:2018-08 瀏覽次數(shù):4441
日期:2017-12 瀏覽次數(shù):3730
日期:2016-09 瀏覽次數(shù):6444
日期:2018-07 瀏覽次數(shù):3221
日期:2016-12 瀏覽次數(shù):3241
日期:2018-10 瀏覽次數(shù):3392
日期:2018-10 瀏覽次數(shù):3502
日期:2018-09 瀏覽次數(shù):3592
日期:2018-02 瀏覽次數(shù):3611
日期:2015-05 瀏覽次數(shù):3537
日期:2018-09 瀏覽次數(shù):3318
日期:2018-06 瀏覽次數(shù):3447
日期:2017-02 瀏覽次數(shù):3884
日期:2018-02 瀏覽次數(shù):4347
日期:2018-02 瀏覽次數(shù):4191
日期:2016-12 瀏覽次數(shù):3587
Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.