我在 EPP 服務器的 ssl_read/ssl_write 函式中遇到奇怪的問題連接后我成功讀取了問候訊息。
bytes = SSL_read(ssl, buf, sizeof(buf)); // get reply & decrypt
buf[bytes] = 0;
ball = bytes;
cc = getInt(buf);
printf("header: %x\n",cc);
printf("Received: \"%s\"\n",buf 4);
前 4 個位元組是 00、00、09、EB,在問候訊息中讀取 2539 個位元組。之后,所有像 hello 或 logins 這樣的操作都在 SSL_read() 時進行;
xml= "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><eppxmlns=\"urn:ietf:params:xml:ns:epp-1.0\"><hello/></epp>";
char bb[1000] = {0};
makeChar(strlen(xml) 4, bb);
memcpy(bb 4, xml, strlen(xml) 4);
bytes = SSL_write(ssl,xml,strlen(xml) 4);
usleep(500000); //sleep 0.5 sec
memset(buf, 0, 1024);
printf("read starting.\n");
bytes = SSL_read(ssl, buf, 1024); //always hang here
buf[bytes]=0;
printf("%d : %s", bytes, buf);
我很困惑。我閱讀了 RFC 檔案,但找不到答案。
在 EPP 檔案中,他們說“為了驗證安全服務器的身份,您需要從 www.verisign.com 免費獲得的‘Verisign Class 3 Public Primary Certification Authority’根證書”。
是不是重要?
uj5u.com熱心網友回復:
是不是重要?
是的,如 RFC 5734“基于 TCP 的可擴展供應協議 (EPP) 傳輸”中所述,EPP 交換的整體安全性系結到 3 個屬性:
- 基于IP地址的訪問串列
- TLS 通信和證書驗證(相互,這就是為什么您 - 作為 EPP 通信中的注冊商或客戶 - 經常提前發送您將在注冊表中使用的證書)
- 命令中使用的 EPP 憑據
<login>。
未能正確保護連接可能意味著:
- 您作為注冊服務商將機密資訊(您自己的 EPP 登錄名、您贊助或不贊助的域名的各種詳細資訊,包括
<authInfo>價值等)發送給非注冊局的第三方 - 相反,有人在注冊管理機構的眼中模仿您,因此您必須承擔您必須承擔的操作,包括購買的所有域的財務費用和法律費用。
但即使在一般情況下,對于所有 TLS 握手情況,如果你想確保作為客戶端連接到你認為的服務器,你需要驗證其證書。
除了瑣碎的事情(日期等),證書:
- 至少應該由您信任的 AC 簽名(您選擇您信任的人)
- 和/或是具有特定指紋/序列號和其他特征的特定證書(但當另一方更改其證書時,您必須保持這一點)
- 和/或匹配 DNS
TLSA記錄
簡而言之,如果您對 EPP 和 TLS 以及 C/C 都不熟悉(正如您在關于 Verisign 證書的其他問題中所述),我強烈建議您不要嘗試自己在如此低的級別上完成所有這些作業(例如,你永遠不應該像上面那樣操作 XML,它不應該是一個字串。同樣,有一些庫可以正確決議和生成 XML 檔案)。您應該使用一個 EPP 庫,它可以為您利用大部分內容。您的注冊表可能會提供您可以使用的“SDK”,您應該詢問它。
PS:您的閱讀可能掛起,因為您沒有以正確的方式發送有效負載(同樣,EPP 庫會為您做的事情)。您需要發送 4 個位元組的長度(您需要在使用 UTF-8 編碼將字串轉換為位元組后進行計算),然后發送有效負載本身。我不確定這是您的代碼的作用。您的閱讀部分也是錯誤的:您應該首先從服務器讀取 4 個位元組,這將為您提供長度(但請注意,理論上它們不一定以單個資料包的形式到達,因此一個“ssl 讀取”可能不會提供全部 4 個位元組,你需要一個回圈),之后你知道你將獲得的有效載荷的長度,這允許你設定適當的緩沖區,如果需要,以及在你收到所有東西時正確檢測。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/534610.html
標籤:C CSSL打开SSL
