實(shí)現(xiàn)要求
首先届谈,可以確認(rèn)怎披,使用 FTPES 的 file transfer 功能在 ORAN M-Plane v8.0 中是一定需要的静陈。
上圖中還規(guī)定了 TLS 1.2 是必須支持的策州。
協(xié)議中還給出了幾個(gè) RFC 的鏈接:
- RFC 4210: "Internet X.509 Public Key Infrastructure Certificate Management Protocol".
- RFC 4217: "Securing FTP with TLS”, IETF, October 2005
- Transport Layer Security (TLS) Parameters. https://www.iana.org/assignments/tls-parameters/tlsparameters.xhtml, Internet Assigned Numbers Authority, (IANA), January 27, 2021
- RFC 5246, "The Transport Layer Security (TLS) Protocol Version 1.2", IETF, August 2008
- RFC 5289, "TLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois Counter Mode (GCM)”, IETF, August 2008.
- RFC 5288, "AES Galois Counter Mode (GCM) Cipher Suites for TLS", August 2008.
- RFC 6125, "Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)", IETF, March 2011
- RFC 7589, "Using the NETCONF Protocol over Transport Layer Security (TLS) with Mutual X.509 Authentication", IETF, June 2015
下圖介紹了一些實(shí)現(xiàn) TLS 1.2 認(rèn)證中的一些要求岖妄。
文檔看下來,能明確的是 file transfer 必須要支持 FTPES彻坛,而 FTPES 是否必須要支持 mutual authentication 并沒有明確說顷啼。 但既然 FTPES 要用到 TLS,且文檔明確要求 TLS 1.2 需要支持昌屉,而 TLS 1.2 目前看來又是 mutual authentication 的钙蒙,所以 FTPES 應(yīng)該也是要支持 mutual authentication 的。
TLS 的基本知識(shí)
mutual TLS 的基本介紹
如何驗(yàn)證自簽名證書
在 client/server 之間的連接中间驮,數(shù)字證書的主要用途是 server 向 client 證明自己的身份躬厌。
server 的證書中,包含數(shù)字簽名竞帽,它是認(rèn)證 server 身份的關(guān)鍵信息扛施。
server 的證書中,包含自己的 public key屹篓,它用于 client 與 server 之間傳輸信息時(shí)的加密疙渣。
現(xiàn)在使用的證書一般都遵循 X.509 標(biāo)準(zhǔn),一個(gè) X.509 證書一般包含以下信息:
- Information about the subject a.k.a. Subject Name- "subject" refers to the site represented by the cert.
- Information about the certificate issuer/certificate authority (CA)- The CA is the body that issued and signed the certificate.
- Serial number- this is the serial number assigned by the issuer to this certificate. Each issuer must make sure each certificate it issues has a unique serial number.
- Version - the X.509 version used by a given certificate. These days, you'll usually find version 3.
- Validity period- certs aren't meant to last forever. The validity period defines the period over which the cert can still be deemed trustworthy.
- Signature - This is the digital signature of the entire digital certificate, generated using the certificate issuer's private key
- Signature algorithm - The cryptographic signature algorithm used to generate the digital signature (e.g. SHA-1 with RSA Encryption)
-
Public key information - Information about the subject's public key. This includes:
- the algorithm (e.g. Elliptic Curve Public Key),
- the key size (e.g. 256 bits),
- the key usage (e.g. can encrypt, verify, derive), and
- the public key itself
Certification Authority 作為一個(gè)可信第三方堆巧,負(fù)責(zé)為其他 entity 簽發(fā)證書妄荔。
Server 通過向 CA 發(fā)送 CSR(certificate signing request) 來申請(qǐng)證書的簽發(fā)。 CSR 中包含 server 自身的一些信息谍肤,CA 通過這些信息來判斷它值得信任啦租,然后 CA 為其簽發(fā)證書。
當(dāng)我們用瀏覽器通過 HTTPS 訪問網(wǎng)站前谣沸,我們的瀏覽器內(nèi)部首先就有一組 certificate刷钢,它又叫 CA certificates,它包含可能用于簽發(fā) server certificate 的 CA 的 public key乳附。 CA 用自己的 private key 為 server 簽發(fā)證書内地,而瀏覽器用本地的 CA certificate 中的 public key 來驗(yàn)證證書是否由這些 CA 簽發(fā)。
支持 FTP 的開源庫(kù)
目前找到的支持 FTPES 的比較出名的開源庫(kù)為 libcurl赋除。
根據(jù) 鏈接阱缓,安裝 curl,以及 libcurl4-openssl-dev举农。
openssl 學(xué)習(xí)
openssl 參考書籍
openssl version
查看 openssl 版本
openssl version -a
詳細(xì)的 openssl 信息荆针,包括 OPENSSLDIR,it is where OpenSSL looks for its default configuration and root certificates。
去 OPENSSLDIR 指定的路徑航背,可以看到 private 路徑喉悴,此路徑用于保存 private keys。
還可以看到 cert 路徑玖媚,此路徑保存 CA certficates箕肃。
此路徑也是 trusted store,即保存受信任的 root certificate今魔。這里的 certificate 只包含 public key勺像,用于 verify 證書。
此外還有一個(gè) key store错森,它包含 private key/public key吟宦,用于生成證書。
簡(jiǎn)單地說涩维,trusted store 用于保存別人的證書殃姓,key store 用于保存你自己的證書。
openssl help
查看 openssl 支持的命令
此輸出有3個(gè)部分瓦阐,第1部分是 Standard commands辰狡,你可以用 man 命令來查看他們的詳細(xì)信息。
比如 ciphers垄分,可以輸入 man openssl-ciphers
第2部分是 digest command,第3部分是 cipher command娃磺。這些先不管薄湿。
為自己的 server 生成 certificate 主要需要 3 步:
- generate a private key
- create a Certificate Signing Request (CSR) and send it to a CA
- install the CA-provided certificate in your server
第一步
其中,步驟1首先需要你選擇加密算法偷卧,密鑰長(zhǎng)度豺瘤,是否給密鑰添加 passphrase。
這里主要用 genpkey 命令听诸。
使用例子:
$ openssl genpkey -out fd.key \
-algorithm RSA \
-pkeyopt rsa_keygen_bits:2048 \
-aes-128-cbc
..........................................+++++
...................................................................+++++
Enter PEM pass phrase: ************
Verifying - Enter PEM pass phrase: ************
這里使用 aes-128 來保護(hù) key坐求,你也可以換成 aes-256,把上面的選項(xiàng)換為 aes-256-cbc
即可晌梨。
生成的 fd.key桥嗤,如果你直接看其內(nèi)容,是基本無意義的仔蝌,可用以下命令查看該文件的structure泛领。
openssl pkey -in fd.key -text -noout
也可用以下命令單獨(dú)看 public key:
$ openssl pkey -in fd.key -pubout -out fd-public.key
Enter pass phrase for fd.key: ****************
第二步
接下來,發(fā)送 CSR 到 CA敛惊,讓它為你簽發(fā)一個(gè)證書渊鞋。
發(fā)送 CSR 是一個(gè)交互的過程,這個(gè)過程中你應(yīng)該仔細(xì)閱讀一下 openssl 給你的提示。
這里需要注意的是锡宋,如果有些項(xiàng)目你想填為空儡湾,你應(yīng)該輸入小數(shù)點(diǎn) .
,而不是直接按回車执俩。直接按回車的話徐钠,值不會(huì)為空,而是默認(rèn)值奠滑。
$ openssl req -new -key fd.key -out fd.csr
Enter pass phrase for fd.key: ****************
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:GB
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:London
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Feisty Duck Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.feistyduck.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
challange password 可以放著不管丹皱。它用于 CA 辨認(rèn) entity 的身份。它并不會(huì)增強(qiáng) CSR 的安全性宋税。其詳細(xì)信息可見 RFC 2985 Section 5.4.1摊崭。
生成 CSR 之后,可以通過以下命令檢查它的內(nèi)容:
$ openssl req -text -in fd.csr -noout
通過編寫 .cnf
文件杰赛,在其中添加我們需要的配置呢簸,也可以讓生成 CSR 的過程不需要任何交互。
如果你的 TLS server 只是給自己用的乏屯,那么你也許并不需要依靠 CA 來給出一個(gè) public trusted certificate根时,你可以自簽發(fā)。比如以下命令可通過 csr 文件生成證書:
$ openssl x509 -req -days 365 -in fd.csr -signkey fd.key -out fd.crt
Signature ok
subject=C = GB, L = London, O = Feisty Duck Ltd, CN = www.feistyduck.com
Getting Private key
Enter pass phrase for fd.key: ****************
可以通過以下命令將 crt 格式的證書轉(zhuǎn)換成 pem 格式:
openssl x509 -in mycert.crt -out mycert.pem -outform PEM
以下命令可通過 key 直接生成證書:
$ openssl req -new -x509 -days 365 -key fd.key -out fd.crt
如果你不想交互式地輸入 subject 信息辰晕,也可以直接在命令行中指定:
$ openssl req -new -x509 -days 365 -key fd.key -out fd.crt \
-subj "/C=GB/L=London/O=Feisty Duck Ltd/CN=www.feistyduck.com"
可以通過以下命令來檢查證書內(nèi)容蛤迎。 其中 -text
用于打印證書內(nèi)容,-noout
用于不打印編碼后的內(nèi)容含友。
$ openssl x509 -text -in fd.crt -noout
openssl 默認(rèn)配置
當(dāng) openssl 啟動(dòng)時(shí)替裆,它會(huì)執(zhí)行以下步驟:
- 檢查
OPENSSL_CONF
環(huán)境變量,它指示配置文件所在路徑窘问。 如果編譯 binary 文件時(shí)加上了setuid
或setguid
選項(xiàng)辆童,則這步會(huì)被跳過。 - 若上一步失敗惠赫,則會(huì)檢查在 compile time 指定的 default system-wide configuration directory把鉴,尋找名為
openssl.cnf
的文件。
我們可以通過以下命令查看默認(rèn)配置文件路徑:
$ openssl version -d
OPENSSLDIR: "/usr/lib/ssl"
找到配置文件后儿咱,可以改其中的內(nèi)容庭砍。以下是一個(gè)例子:
[default_conf]
ssl_conf = ssl_section
[ssl_section]
system_default = system_default_section
[system_default_section]
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=2
Ciphersuites = TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256
Options = ServerPreference,PrioritizeChaCha
更多有關(guān)配置的信息,推薦查看 openssl 官方文檔混埠。
此 鏈接 為 Mozilla CA certificate store逗威,我們可以將其下載下來,作為 cacert.pem 保存岔冀。我們可以通過它為我們校驗(yàn)一個(gè)證書凯旭,如下面的命令:
$ openssl verify -verbose -CAfile cacert.pem server.crt
server.crt: OK
如果返回的結(jié)果不是 OK概耻,則說明此證書不是由以上的 CA 簽名的。
FTPS server -- vsftpd
ubuntu doc about FTP server
vsftpd 配置文檔
參考鏈接之配置 vsftpd 驗(yàn)證 client certificate
在 ubuntu 中罐呼,可以用 vsftpd 作為 FTP server鞠柄。
sudo apt install vsftpd
vsftpd 的配置文件在 /etc/vsftpd.conf
其 log 文件默認(rèn)在 /var/log/vsftpd.log
,但可以在配置文件中修改嫉柴。
在修改 vsftpd 的配置后厌杜,可用以下命令重啟 vsftpd 使其生效
service vsftpd restart
vsftpd 匿名 user 的 home 路徑在 /srv/ftp
使用以下命令生成自簽名證書,并修改配置文件中的參數(shù)计螺,使用此證書
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
添加 self-signed certificate 到 trusted store
參考鏈接
在 Debian 系統(tǒng)中夯尽,可以執(zhí)行以下步驟:
- Install the ca-certificates package
apt-get install ca-certificates
- You then copy the public half of your untrusted CA certificate (the one you use to sign your CSR) into the CA certificate directory (as root):
cp cacert.crt /usr/share/ca-certificates
NOTE: Certificate needs to have .crt extension for it to be picked up.
And get it to rebuild the directory with your certificate included, run as root:
dpkg-reconfigure ca-certificates
and select the ask option, scroll to your certificate, mark it for inclusion and select ok.
curl 訪問 ftp server
參考鏈接之 curl 常用命令
參考鏈接之 curl 中的 FTPS 相關(guān)選項(xiàng)
上傳文件時(shí)需要的 ftp server 配置
使用以下命令訪問 ftp server
curl -v --cacert vsftpd.pem --user username:passwd --ssl-reqd ftp://hostname
curl -v --cacert vsftpd.pem -T uploadfile.txt --ssl-reqd ftp://hostname/upload/myfile
curl -v -k -E client-crt.pem --ftp-ssl-reqd ftp://server:21/testfile
與 TLS 相關(guān)的 curl_easy_setopt 函數(shù)的 option:
CURLOPT_SSL_VERIFYPEER
CURLOPT_CAINFO
-
CURLOPT_SSLKEY
andCURLOPT_SSLCERT
用于配置 client certificate
上傳文件
當(dāng) client 以 anonymous 訪問的時(shí)候,在 server 端使用的用戶并不是 anonymous登馒,而是 ftp匙握。
想要讓 client 以 anonymous 成功上傳文件,必須合理配置 server 端的權(quán)限陈轿。
vsftpd server 默認(rèn)的 ftp 根目錄在 /srv/ftp
圈纺,我們需要確保此目錄的所有者和群組為 root。配置此路徑的權(quán)限為 555麦射。
在 ftp 根目錄下創(chuàng)建一個(gè) download 路徑蛾娶,用于下載文件。所有者和群組為 ftp潜秋,權(quán)限為555蛔琅。
在 ftp 根目錄下創(chuàng)建一個(gè) upload 路徑,用于上傳文件峻呛。所有者和群組為 ftp揍愁,權(quán)限為755。
vsftpd server 的版本為 3.0.5杀饵,其配置文件內(nèi)容如下:
listen=NO
listen_ipv6=YES
anonymous_enable=YES
local_enable=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_root=/srv/ftp
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=YES
require_ssl_reuse=NO
allow_writeable_chroot=YES