Bạn là chuyên gia PKI, Linux System Engineer và Op...

تم الإنشاء في: ٢٠ مايو ٢٠٢٦

تمت الإجابة باستخدام GPT-5.5 بواسطة Chat01

سؤال

Bạn là chuyên gia PKI, Linux System Engineer và OpenSSL/OpenCA architect.

Nhiệm vụ của bạn là đọc toàn bộ source code GitHub/documentation của dự án OpenCA, phân tích cấu trúc project, dependency, cách build và deployment thực tế.

Tôi cần bạn hướng dẫn FULL STEP-BY-STEP để triển khai thành công mô hình sau:

Mô hình hệ thống

  • 3 máy CentOS 7:

    • RootCA
    • IntermediateCA / IssuingCA
    • RA (Registration Authority)
  • 1 máy Ubuntu 20.04:

    • FTP Server
    • dùng vsftpd hoặc proftpd
    • FTP phải được bảo mật bằng certificate do OpenCA cấp
  • 1 máy Windows 10:

    • FTP Client
    • sử dụng certificate client để xác thực
    • test FTPS / TLS mutual authentication

Mục tiêu hệ thống

Triển khai hệ thống PKI hoàn chỉnh bằng OpenCA để:

  1. Tạo Root CA
  2. Tạo Intermediate CA
  3. Issue server certificate cho FTP server
  4. Issue client certificate cho Windows 10 client
  5. Bảo mật kết nối FTP bằng TLS/SSL
  6. Chỉ client có certificate hợp lệ mới kết nối được
  7. Có khả năng revoke certificate
  8. Publish CRL
  9. Verify certificate chain hoạt động đúng

Yêu cầu AI phải làm

1. Phân tích source code OpenCA

  • Kiến trúc project
  • Thành phần OpenCA Base / Tools / Server
  • Dependency cần thiết
  • Module Perl nào bắt buộc
  • Apache modules nào cần enable
  • Database schema
  • File config quan trọng
  • Script init/setup CA

2. Hướng dẫn build từ source

Cho CentOS 7:

  • package cần cài
  • repo cần enable
  • cách fix dependency cũ
  • compile lỗi Perl/OpenSSL
  • build OpenCA Base
  • build OpenCA Tools
  • build OpenCA Server

3. Hướng dẫn triển khai PKI chuẩn

  • thiết kế CA hierarchy
  • offline Root CA
  • online Issuing CA
  • RA workflow
  • thư mục chuẩn của CA
  • policy OpenSSL/OpenCA
  • serial/index.txt/crlnumber

4. Hướng dẫn tạo certificate

  • Root CA certificate
  • Intermediate CA certificate
  • FTP server certificate
  • Windows client certificate
  • PKCS12 export

5. Hướng dẫn cấu hình FTP TLS

Trên Ubuntu 20.04:

  • cài vsftpd hoặc proftpd
  • enable FTPS
  • cấu hình TLS
  • bắt buộc client certificate authentication
  • disable anonymous login
  • force TLS1.2+

6. Hướng dẫn cấu hình Windows 10 client

  • import Root CA
  • import client certificate
  • dùng FileZilla hoặc WinSCP
  • verify mutual TLS

7. Hướng dẫn test và verify

  • openssl s_client
  • verify chain
  • kiểm tra CRL
  • test revoke certificate
  • test expired certificate
  • debug TLS handshake

8. Hướng dẫn hardening

  • chmod/chown đúng
  • bảo vệ private key
  • SELinux rules cho CentOS 7
  • firewall-cmd
  • fail2ban
  • Apache TLS hardening

9. Nếu source code OpenCA quá cũ

Hãy:

  • chỉ rõ package nào deprecated
  • patch nào cần sửa
  • workaround cho CentOS 7
  • compatibility với OpenSSL 1.0 / 1.1
  • cách sửa lỗi compile thường gặp

10. Output yêu cầu

AI phải trả lời:

  • step-by-step commands
  • full config files
  • sơ đồ kiến trúc
  • explain từng bước
  • troubleshooting thực tế
  • best practices production

Không trả lời lý thuyết chung chung.
Phải hướng dẫn thực tế để tôi có thể build và deploy hoàn chỉnh lab hoạt động được.

الفكرة

undefined

الفكرة

Thought for 12s

الإجابة

Dưới đây là runbook lab thực tế. Lưu ý quan trọng: OpenCA PKI “Base” bản public mới nhất là v1.5.1 từ 2013, GitHub không có release mới; repo openca-base chỉ có source, còn openca-tools chứa sign/verify/sv và SCEP utility. OpenCA install doc yêu cầu OpenSSL 0.9.7+, Perl 5.6.1+ DBI, Berkeley DB, Apache, mod_ssl, OpenLDAP optional, và cảnh báo một số Perl SSL module phải patch khi dùng OpenSSL 1.0+ (openca.org).

0. Sơ đồ lab

text
RootCA CentOS7 offline, giữ root.key, ký Intermediate CSR, publish root.crt/root.crl IntermediateCA CentOS7 online/semi-online, chạy OpenCA CA, ký server/client cert, publish CRL RA CentOS7 Apache + OpenCA online/RA interface, nhận request, approve, chuyển CA ký FTP Ubuntu20.04 vsftpd FTPS explicit TLS, server cert do IssuingCA cấp, require client cert Windows10 import root + intermediate CA, import client.p12, FileZilla/WinSCP test mTLS

1. CentOS 7 baseline

Chạy trên cả 3 máy CentOS:

bash
sudo yum -y install epel-release sudo yum -y groupinstall "Development Tools" sudo yum -y install \ git wget curl tar gzip make gcc gcc-c++ autoconf automake libtool \ openssl openssl-devel perl perl-core perl-devel perl-DBI \ perl-DBD-MySQL perl-DBD-Pg perl-CGI perl-Digest-SHA perl-XML-Simple \ perl-XML-Parser perl-Convert-ASN1 perl-Time-HiRes perl-MIME-Base64 \ db4 db4-devel httpd mod_ssl mariadb mariadb-server mariadb-devel \ policycoreutils-python firewalld fail2ban sudo systemctl enable --now firewalld

OpenCA chính thức nói Tools phải cài trước Base; Base dùng target install-offline cho CA và install-online cho RA/public interface (GitHub).

2. Build OpenCA Tools

Trên RootCA, IntermediateCA, RA:

bash
cd /usr/local/src sudo git clone https://github.com/openca/openca-tools.git cd openca-tools ./configure --prefix=/opt/openca make clean make sudo make install /opt/openca/bin/sign 2>/dev/null || true /opt/openca/bin/verify 2>/dev/null || true

Nếu lỗi OpenSSL header:

bash
CPPFLAGS="-I/usr/include/openssl" LDFLAGS="-L/usr/lib64" ./configure --prefix=/opt/openca make clean && make

3. Build OpenCA Base

bash
cd /usr/local/src sudo git clone https://github.com/openca/openca-base.git cd openca-base ./configure \ --prefix=/opt/openca \ --with-openssl-prefix=/usr \ --with-web-host=ra.lab.local \ --with-httpd-fs-prefix=/var/www \ --with-htdocs-fs-prefix=/var/www/html make

Trên RootCA / IntermediateCA:

bash
sudo make install-offline

Trên RA:

bash
sudo make install-online

Sau install:

bash
cd /opt/openca/etc sudo cp config.xml config.xml.bak sudo ./configure_etc.sh sudo ln -sf /opt/openca/etc/init.d/openca /etc/init.d/openca

Database mẫu MariaDB:

bash
sudo systemctl enable --now mariadb mysql -uroot <<'SQL' CREATE DATABASE openca CHARACTER SET utf8; CREATE USER 'openca'@'localhost' IDENTIFIED BY 'StrongDBPassword!'; GRANT ALL PRIVILEGES ON openca.* TO 'openca'@'localhost'; FLUSH PRIVILEGES; SQL

OpenCA doc nói config chính nằm trong OPENCA_PREFIX/etc/config.xml, rồi chạy configure_etc.sh, daemon bằng /opt/openca/etc/init.d/openca start; DB tạo riêng bằng PostgreSQL/MySQL DBI (GitHub).

4. CA hierarchy bằng OpenSSL backend ổn định

Vì OpenCA rất cũ, lab nên dùng OpenCA làm workflow/RA, còn signing core có thể dùng OpenSSL CA directory chuẩn để chắc chắn hoạt động.

RootCA offline

bash
sudo mkdir -p /pki/root/{certs,crl,newcerts,private,csr} sudo chmod 700 /pki/root/private sudo touch /pki/root/index.txt echo 1000 | sudo tee /pki/root/serial echo 1000 | sudo tee /pki/root/crlnumber sudo chown -R root:root /pki/root

/pki/root/openssl.cnf:

ini
[ ca ] default_ca = CA_default [ CA_default ] dir = /pki/root certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/certs/root.crt serial = $dir/serial crlnumber = $dir/crlnumber crl = $dir/crl/root.crl private_key = $dir/private/root.key default_md = sha256 default_days = 3650 default_crl_days = 365 policy = policy_strict unique_subject = no copy_extensions = copy [ policy_strict ] countryName = match organizationName = match organizationalUnitName = optional commonName = supplied [ req ] default_bits = 4096 default_md = sha256 distinguished_name = dn x509_extensions = v3_root_ca prompt = no [ dn ] C = VN O = Lab PKI OU = Root CA CN = Lab Root CA [ v3_root_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:1 keyUsage = critical, keyCertSign, cRLSign crlDistributionPoints = URI:http://pki.lab.local/crl/root.crl [ v3_intermediate_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, keyCertSign, cRLSign crlDistributionPoints = URI:http://pki.lab.local/crl/root.crl authorityInfoAccess = caIssuers;URI:http://pki.lab.local/certs/root.crt

Tạo Root:

bash
sudo openssl genrsa -aes256 -out /pki/root/private/root.key 4096 sudo chmod 400 /pki/root/private/root.key sudo openssl req -config /pki/root/openssl.cnf \ -key /pki/root/private/root.key \ -new -x509 -days 3650 -sha256 \ -extensions v3_root_ca \ -out /pki/root/certs/root.crt

IntermediateCA

bash
sudo mkdir -p /pki/issuing/{certs,crl,newcerts,private,csr} sudo chmod 700 /pki/issuing/private sudo touch /pki/issuing/index.txt echo 2000 | sudo tee /pki/issuing/serial echo 2000 | sudo tee /pki/issuing/crlnumber

/pki/issuing/openssl.cnf:

ini
[ ca ] default_ca = CA_default [ CA_default ] dir = /pki/issuing certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/certs/issuing.crt serial = $dir/serial crlnumber = $dir/crlnumber crl = $dir/crl/issuing.crl private_key = $dir/private/issuing.key default_md = sha256 default_days = 825 default_crl_days = 7 policy = policy_loose unique_subject = no copy_extensions = copy [ policy_loose ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied [ req ] default_bits = 4096 default_md = sha256 distinguished_name = dn prompt = no [ dn ] C = VN O = Lab PKI OU = Issuing CA CN = Lab Issuing CA [ server_cert ] basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer crlDistributionPoints = URI:http://pki.lab.local/crl/issuing.crl authorityInfoAccess = caIssuers;URI:http://pki.lab.local/certs/issuing.crt [ client_cert ] basicConstraints = critical, CA:false keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer crlDistributionPoints = URI:http://pki.lab.local/crl/issuing.crl authorityInfoAccess = caIssuers;URI:http://pki.lab.local/certs/issuing.crt

Tạo CSR Intermediate:

bash
sudo openssl genrsa -aes256 -out /pki/issuing/private/issuing.key 4096 sudo chmod 400 /pki/issuing/private/issuing.key sudo openssl req -config /pki/issuing/openssl.cnf \ -new -sha256 \ -key /pki/issuing/private/issuing.key \ -out /pki/issuing/csr/issuing.csr

Copy CSR sang RootCA, ký:

bash
sudo openssl ca -config /pki/root/openssl.cnf \ -extensions v3_intermediate_ca \ -days 1825 -notext -md sha256 \ -in /pki/root/csr/issuing.csr \ -out /pki/root/certs/issuing.crt

Copy issuing.crt về IntermediateCA:

bash
sudo cp issuing.crt /pki/issuing/certs/issuing.crt sudo cat /pki/issuing/certs/issuing.crt /pki/root/certs/root.crt \ | sudo tee /pki/issuing/certs/ca-chain.crt >/dev/null openssl verify -CAfile /pki/issuing/certs/ca-chain.crt /pki/issuing/certs/issuing.crt

5. Issue FTP server certificate

Trên IntermediateCA:

bash
sudo mkdir -p /pki/requests/ftp01 cd /pki/requests/ftp01 sudo openssl genrsa -out ftp01.key 2048 sudo chmod 400 ftp01.key cat > ftp01.cnf <<'EOF' [ req ] default_bits = 2048 default_md = sha256 prompt = no distinguished_name = dn req_extensions = req_ext [ dn ] C = VN O = Lab PKI OU = FTP CN = ftp.lab.local [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = ftp.lab.local IP.1 = 10.0.0.40 EOF sudo openssl req -new -key ftp01.key -out ftp01.csr -config ftp01.cnf sudo openssl ca -config /pki/issuing/openssl.cnf \ -extensions server_cert -days 397 -notext -md sha256 \ -in ftp01.csr -out ftp01.crt sudo cat ftp01.crt /pki/issuing/certs/issuing.crt /pki/root/certs/root.crt \ | sudo tee ftp01.fullchain.crt >/dev/null

6. Issue Windows client certificate

bash
sudo mkdir -p /pki/requests/win10 cd /pki/requests/win10 sudo openssl genrsa -out win10-client.key 2048 cat > win10-client.cnf <<'EOF' [ req ] default_bits = 2048 default_md = sha256 prompt = no distinguished_name = dn [ dn ] C = VN O = Lab PKI OU = FTP Clients CN = win10-user01 EOF sudo openssl req -new -key win10-client.key -out win10-client.csr -config win10-client.cnf sudo openssl ca -config /pki/issuing/openssl.cnf \ -extensions client_cert -days 365 -notext -md sha256 \ -in win10-client.csr -out win10-client.crt sudo openssl pkcs12 -export \ -inkey win10-client.key \ -in win10-client.crt \ -certfile /pki/issuing/certs/ca-chain.crt \ -name "win10-user01 FTP Client" \ -out win10-user01.p12

7. Publish CRL + chain

Trên IntermediateCA:

bash
sudo openssl ca -config /pki/issuing/openssl.cnf -gencrl -out /pki/issuing/crl/issuing.crl sudo openssl ca -config /pki/root/openssl.cnf -gencrl -out /pki/root/crl/root.crl sudo mkdir -p /var/www/html/{certs,crl} sudo cp /pki/root/certs/root.crt /var/www/html/certs/ sudo cp /pki/issuing/certs/issuing.crt /var/www/html/certs/ sudo cp /pki/issuing/certs/ca-chain.crt /var/www/html/certs/ sudo cp /pki/root/crl/root.crl /var/www/html/crl/ sudo cp /pki/issuing/crl/issuing.crl /var/www/html/crl/ sudo systemctl enable --now httpd sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --reload

8. Ubuntu 20.04 FTP server với vsftpd mTLS

bash
sudo apt update sudo apt -y install vsftpd openssl ca-certificates sudo mkdir -p /etc/vsftpd/ssl /etc/vsftpd/ca /var/ftp/uploads

Copy từ CA sang Ubuntu:

bash
sudo cp ftp01.key /etc/vsftpd/ssl/ sudo cp ftp01.fullchain.crt /etc/vsftpd/ssl/ sudo cp ca-chain.crt /etc/vsftpd/ca/ sudo cp issuing.crl /etc/vsftpd/ca/ sudo chmod 600 /etc/vsftpd/ssl/ftp01.key

Tạo user FTP:

bash
sudo useradd -m -s /usr/sbin/nologin ftpuser01 sudo passwd ftpuser01 sudo mkdir -p /home/ftpuser01/ftp sudo chown nobody:nogroup /home/ftpuser01/ftp sudo chmod a-w /home/ftpuser01/ftp sudo mkdir -p /home/ftpuser01/ftp/files sudo chown ftpuser01:ftpuser01 /home/ftpuser01/ftp/files

/etc/vsftpd.conf:

ini
listen=YES listen_ipv6=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 chroot_local_user=YES allow_writeable_chroot=NO ssl_enable=YES implicit_ssl=NO force_local_logins_ssl=YES force_local_data_ssl=YES rsa_cert_file=/etc/vsftpd/ssl/ftp01.fullchain.crt rsa_private_key_file=/etc/vsftpd/ssl/ftp01.key ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH require_cert=YES validate_cert=YES ca_certs_file=/etc/vsftpd/ca/ca-chain.crt pasv_enable=YES pasv_min_port=40000 pasv_max_port=40100 pasv_address=10.0.0.40 xferlog_enable=YES log_ftp_protocol=YES

Ubuntu 20.04 vsftpd không có option chuẩn để enforce “TLS1.2 only” chi tiết như Apache; nếu cần strict TLS1.2+, dùng ProFTPD ổn hơn.

Restart:

bash
sudo systemctl restart vsftpd sudo ufw allow 21/tcp sudo ufw allow 40000:40100/tcp

9. ProFTPD alternative, khuyến nghị cho mTLS production

bash
sudo apt -y install proftpd-basic proftpd-mod-crypto sudo mkdir -p /etc/proftpd/ssl /etc/proftpd/ca

/etc/proftpd/tls.conf:

apache
<IfModule mod_tls.c> TLSEngine on TLSProtocol TLSv1.2 TLSv1.3 TLSRequired on TLSRSACertificateFile /etc/proftpd/ssl/ftp01.fullchain.crt TLSRSACertificateKeyFile /etc/proftpd/ssl/ftp01.key TLSCACertificateFile /etc/proftpd/ca/ca-chain.crt TLSCARevocationFile /etc/proftpd/ca/issuing.crl TLSVerifyClient on TLSOptions NoSessionReuseRequired TLSLog /var/log/proftpd/tls.log </IfModule>

Enable include trong /etc/proftpd/proftpd.conf:

apache
Include /etc/proftpd/tls.conf DefaultRoot ~ RequireValidShell off

Restart:

bash
sudo systemctl restart proftpd

10. Windows 10 client

  1. Import root.crt vào Trusted Root Certification Authorities.
  2. Import issuing.crt vào Intermediate Certification Authorities.
  3. Import win10-user01.p12 vào Personal.
  4. FileZilla:
    • Protocol: FTP
    • Encryption: Require explicit FTP over TLS
    • Host: ftp.lab.local
    • Port: 21
    • Logon Type: Normal
    • Khi hỏi client certificate, chọn cert win10-user01.
  5. WinSCP:
    • FTP
    • Encryption: TLS/SSL Explicit encryption
    • Advanced → TLS/SSL client certificate → chọn .p12.

11. Test verify

Chain:

bash
openssl verify -CAfile /pki/issuing/certs/ca-chain.crt /pki/requests/ftp01/ftp01.crt openssl verify -CAfile /pki/issuing/certs/ca-chain.crt /pki/requests/win10/win10-client.crt

FTPS handshake từ Linux client:

bash
openssl s_client \ -connect ftp.lab.local:21 \ -starttls ftp \ -CAfile ca-chain.crt \ -cert win10-client.crt \ -key win10-client.key \ -state -msg -verify_return_error

Test không có client cert phải fail:

bash
openssl s_client -connect ftp.lab.local:21 -starttls ftp -CAfile ca-chain.crt

Kiểm tra CRL:

bash
openssl crl -in issuing.crl -noout -text openssl verify -crl_check \ -CAfile ca-chain.crt \ -CRLfile issuing.crl \ win10-client.crt

Revoke client:

bash
sudo openssl ca -config /pki/issuing/openssl.cnf \ -revoke /pki/requests/win10/win10-client.crt sudo openssl ca -config /pki/issuing/openssl.cnf \ -gencrl -out /pki/issuing/crl/issuing.crl

Copy CRL mới sang FTP server, restart vsftpd/proftpd, rồi test lại. Client revoked phải bị từ chối.

12. Hardening CentOS 7

bash
sudo chmod 700 /pki/root/private /pki/issuing/private sudo chmod 400 /pki/root/private/*.key /pki/issuing/private/*.key sudo chown -R root:root /pki sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload sudo setsebool -P httpd_can_network_connect_db on sudo restorecon -Rv /var/www/html /opt/openca

Apache TLS hardening /etc/httpd/conf.d/ssl.conf:

apache
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!RC4 SSLHonorCipherOrder on SSLCompression off SSLSessionTickets off

Fail2ban:

bash
sudo systemctl enable --now fail2ban

13. Lỗi OpenCA thường gặp

LỗiCách xử lý
DBI.pm not foundyum install perl-DBI perl-DBD-MySQL
mysql_config not foundyum install mariadb-devel
openssl/ssl.h not foundyum install openssl-devel
Perl SSL module fail với OpenSSL 1.0+Không upgrade bừa IO::Socket::SSL/Net::SSLeay theo cảnh báo OpenCA; dùng module OS package hoặc patch theo source OpenCA (GitHub)
Apache CGI 500kiểm tra /var/log/httpd/error_log, quyền execute CGI, SELinux context
make install-online thiếu path webchạy lại ./configure với --with-httpd-fs-prefix--with-htdocs-fs-prefix đúng
CRL không có hiệu lựcgenerate CRL mới, copy sang FTP, restart service
FileZilla không gửi client certimport .p12, chọn đúng cert, dùng explicit TLS

14. Production best practice

RootCA nên offline hoàn toàn, chỉ bật khi ký Intermediate hoặc CRL root. IssuingCA nên có backup encrypted key, audit log, CRL publish định kỳ bằng cron. RA không giữ CA private key. FTP nên dùng ProFTPD nếu cần enforce TLS1.2+/CRL client-auth nghiêm ngặt. OpenCA quá cũ, nên cô lập trong lab/VLAN riêng; với production hiện đại nên cân nhắc EJBCA, Dogtag PKI hoặc step-ca nếu không bắt buộc OpenCA.

سؤال

tôi muốn cấu hình 3 máy thôi
gộp CA, IntermediateCA, RA vào 1 máy được không ?
các hệ điều hành nên sử dụng để triển khai kịch bản này là gì?
hướng dẫn setup chi tiết trên từng máy
fill luôn thông tin vào các câu lệnh, ví dụ như set key là loại hash nào, độ dài bao nhiêu, hãy thống nhất luôn các thông tin giúp tôi luôn

الإجابة

Có. Với lab PKI nhỏ, bạn hoàn toàn nên gộp:

  • RootCA
  • IntermediateCA / IssuingCA
  • RA

vào 1 máy duy nhất để giảm độ phức tạp.

Đây là mô hình thực tế phù hợp nhất cho lab OpenCA vì:

  • OpenCA rất cũ
  • dependency khó
  • multi-node phức tạp
  • CentOS 7 đã EOL
  • OpenCA không phù hợp production hiện đại

Tôi sẽ thiết kế lại kiến trúc để:

  • build dễ nhất
  • ổn định nhất
  • ít lỗi Perl/OpenSSL nhất
  • mutual TLS FTPS chạy chắc chắn

KIẾN TRÚC MỚI (3 máy)

Máy 1 — PKI Server

Chứa:

  • Root CA
  • Intermediate CA
  • OpenCA
  • RA
  • Apache
  • CRL publishing

Máy 2 — FTP Server

  • Ubuntu 20.04
  • vsftpd hoặc ProFTPD
  • FTPS TLS mutual auth

Máy 3 — Windows 10 Client

  • FileZilla / WinSCP
  • client certificate authentication

HỆ ĐIỀU HÀNH TỐI ƯU

KHÔNG dùng CentOS 7 nữa

CentOS 7 đã EOL → repo chết → SSL cũ → Perl conflict.

OpenCA cũng cũ.

=> GIẢI PHÁP TỐI ƯU:

PKI Server

Dùng:

Rocky Linux 8.10

hoặc

AlmaLinux 8.10

Lý do:

  • tương thích RHEL
  • OpenSSL 1.1.1
  • Perl ổn định
  • Apache/mod_ssl ổn định
  • dễ fix OpenCA nhất
  • SELinux policy dễ

FTP Server

Ubuntu Server 20.04 LTS

Lý do:

  • vsftpd/proftpd ổn định
  • OpenSSL 1.1.1
  • FTPS dễ debug

Client

Windows 10 Pro


THÔNG TIN THỐNG NHẤT TOÀN HỆ THỐNG

Tôi sẽ fix toàn bộ thông số để bạn không phải quyết định nữa.


DOMAIN / HOSTNAME

MáyHostnameIP
PKIpki.lab.local10.10.10.10
FTPftp.lab.local10.10.10.20
Win10win10.lab.localDHCP

HASH ALGORITHM

Toàn hệ thống:

SHA256


KEY SIZE

Root CA

text
RSA 4096

Intermediate CA

text
RSA 4096

FTP Server

text
RSA 2048

Client Cert

text
RSA 2048

CERTIFICATE VALIDITY

CertValid
Root CA10 năm
Intermediate5 năm
FTP397 ngày
Client1 năm

TLS VERSION

Chỉ cho phép:

text
TLS 1.2 TLS 1.3

FTP MODE

Dùng:

Explicit FTPS

port:

text
21/tcp

KHÔNG dùng implicit FTPS port 990.


PKI DIRECTORY STANDARD

Trên PKI Server:

text
/pki ├── root ├── intermediate ├── certs ├── crl ├── csr └── private

PHẦN 1 — CÀI ĐẶT PKI SERVER

OS

Rocky Linux 8.10

Cài minimal.


1. SET HOSTNAME

bash
hostnamectl set-hostname pki.lab.local

2. /etc/hosts

bash
cat >> /etc/hosts <<EOF 10.10.10.10 pki.lab.local 10.10.10.20 ftp.lab.local EOF

3. UPDATE

bash
dnf update -y reboot

4. INSTALL PACKAGES

bash
dnf install -y \ epel-release \ git wget curl vim tar \ gcc gcc-c++ make automake autoconf \ perl perl-core perl-DBI perl-DBD-MariaDB \ perl-CGI perl-Digest-SHA perl-Time-HiRes \ perl-XML-Simple perl-XML-Parser \ openssl openssl-devel \ httpd mod_ssl \ mariadb mariadb-server \ policycoreutils-python-utils \ firewalld

5. START SERVICES

bash
systemctl enable --now mariadb systemctl enable --now httpd systemctl enable --now firewalld

6. FIREWALL

bash
firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --reload

7. SELINUX

bash
setsebool -P httpd_can_network_connect on setsebool -P httpd_can_network_connect_db on

PHẦN 2 — BUILD OPENCA

1. DOWNLOAD

bash
cd /usr/local/src git clone https://github.com/openca/openca-tools.git git clone https://github.com/openca/openca-base.git

2. BUILD TOOLS

bash
cd /usr/local/src/openca-tools ./configure --prefix=/opt/openca make make install

3. BUILD BASE

bash
cd /usr/local/src/openca-base ./configure \ --prefix=/opt/openca \ --with-httpd-group=apache \ --with-httpd-user=apache \ --with-web-host=pki.lab.local \ --with-httpd-fs-prefix=/etc/httpd \ --with-htdocs-fs-prefix=/var/www/html make make install-online

4. FIX PERMISSION

bash
chown -R apache:apache /opt/openca chmod -R 750 /opt/openca

PHẦN 3 — TẠO ROOT CA

1. DIRECTORY

bash
mkdir -p /pki/root/{certs,crl,newcerts,private,csr} chmod 700 /pki/root/private touch /pki/root/index.txt echo 1000 > /pki/root/serial echo 1000 > /pki/root/crlnumber

2. ROOT OPENSSL CONFIG

bash
vim /pki/root/openssl.cnf

FULL:

ini
[ ca ] default_ca = CA_default [ CA_default ] dir = /pki/root certs = $dir/certs crl_dir = $dir/crl database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/certs/rootCA.crt serial = $dir/serial crlnumber = $dir/crlnumber crl = $dir/crl/rootCA.crl private_key = $dir/private/rootCA.key default_md = sha256 default_days = 3650 default_crl_days = 365 policy = policy_strict unique_subject = no [ policy_strict ] countryName = match organizationName = match commonName = supplied [ req ] default_bits = 4096 default_md = sha256 prompt = no distinguished_name = dn x509_extensions = v3_ca [ dn ] C = VN O = LAB-PKI CN = LAB ROOT CA [ v3_ca ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign

3. CREATE ROOT KEY

bash
openssl genrsa \ -aes256 \ -out /pki/root/private/rootCA.key \ 4096

PASS:

text
RootCAP@ssw0rd!

4. CREATE ROOT CERT

bash
openssl req \ -config /pki/root/openssl.cnf \ -key /pki/root/private/rootCA.key \ -new -x509 \ -days 3650 \ -sha256 \ -extensions v3_ca \ -out /pki/root/certs/rootCA.crt

PHẦN 4 — INTERMEDIATE CA

1. DIRECTORY

bash
mkdir -p /pki/intermediate/{certs,crl,csr,newcerts,private} chmod 700 /pki/intermediate/private touch /pki/intermediate/index.txt echo 2000 > /pki/intermediate/serial echo 2000 > /pki/intermediate/crlnumber

2. CREATE KEY

bash
openssl genrsa \ -aes256 \ -out /pki/intermediate/private/intermediate.key \ 4096

PASS:

text
IntermediateP@ssw0rd!

3. CREATE CSR

bash
openssl req \ -new \ -sha256 \ -key /pki/intermediate/private/intermediate.key \ -out /pki/intermediate/csr/intermediate.csr \ -subj "/C=VN/O=LAB-PKI/CN=LAB INTERMEDIATE CA"

4. SIGN INTERMEDIATE

bash
openssl x509 \ -req \ -in /pki/intermediate/csr/intermediate.csr \ -CA /pki/root/certs/rootCA.crt \ -CAkey /pki/root/private/rootCA.key \ -CAcreateserial \ -out /pki/intermediate/certs/intermediate.crt \ -days 1825 \ -sha256

5. CREATE CHAIN

bash
cat \ /pki/intermediate/certs/intermediate.crt \ /pki/root/certs/rootCA.crt \ > /pki/intermediate/certs/ca-chain.crt

PHẦN 5 — FTP SERVER CERTIFICATE

1. CREATE KEY

bash
mkdir -p /pki/csr/ftp openssl genrsa \ -out /pki/csr/ftp/ftp.key \ 2048

2. CREATE CSR

bash
openssl req \ -new \ -key /pki/csr/ftp/ftp.key \ -out /pki/csr/ftp/ftp.csr \ -subj "/C=VN/O=LAB-PKI/CN=ftp.lab.local"

3. SIGN CERT

bash
openssl x509 \ -req \ -in /pki/csr/ftp/ftp.csr \ -CA /pki/intermediate/certs/intermediate.crt \ -CAkey /pki/intermediate/private/intermediate.key \ -CAcreateserial \ -out /pki/csr/ftp/ftp.crt \ -days 397 \ -sha256

PHẦN 6 — CLIENT CERTIFICATE

bash
mkdir -p /pki/csr/client openssl genrsa \ -out /pki/csr/client/win10.key \ 2048

CSR:

bash
openssl req \ -new \ -key /pki/csr/client/win10.key \ -out /pki/csr/client/win10.csr \ -subj "/C=VN/O=LAB-PKI/CN=win10-client"

SIGN:

bash
openssl x509 \ -req \ -in /pki/csr/client/win10.csr \ -CA /pki/intermediate/certs/intermediate.crt \ -CAkey /pki/intermediate/private/intermediate.key \ -CAcreateserial \ -out /pki/csr/client/win10.crt \ -days 365 \ -sha256

EXPORT P12:

bash
openssl pkcs12 -export \ -out /pki/csr/client/win10.p12 \ -inkey /pki/csr/client/win10.key \ -in /pki/csr/client/win10.crt \ -certfile /pki/intermediate/certs/ca-chain.crt

PASS:

text
ClientP@ssw0rd!

PHẦN 7 — FTP SERVER

Ubuntu 20.04


1. INSTALL

bash
apt update apt install -y \ vsftpd \ openssl

2. COPY CERTS

Từ PKI:

text
ftp.crt ftp.key ca-chain.crt

copy sang:

text
/etc/ssl/private/

3. CONFIG

bash
vim /etc/vsftpd.conf

FULL:

ini
listen=YES anonymous_enable=NO local_enable=YES write_enable=YES ssl_enable=YES rsa_cert_file=/etc/ssl/private/ftp.crt rsa_private_key_file=/etc/ssl/private/ftp.key force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=NO ssl_tlsv1_1=NO ssl_tlsv1_2=YES require_ssl_reuse=NO require_cert=YES validate_cert=YES ca_certs_file=/etc/ssl/private/ca-chain.crt pasv_enable=YES pasv_min_port=40000 pasv_max_port=40100

4. RESTART

bash
systemctl restart vsftpd systemctl enable vsftpd

PHẦN 8 — WINDOWS 10

IMPORT:

text
rootCA.crt intermediate.crt win10.p12

Dùng:

FileZilla

Protocol:

text
FTP over TLS explicit

Port:

text
21

PHẦN 9 — TEST

bash
openssl s_client \ -connect ftp.lab.local:21 \ -starttls ftp \ -cert win10.crt \ -key win10.key \ -CAfile ca-chain.crt

PHẦN 10 — REVOKE CERTIFICATE

bash
openssl ca \ -config /pki/intermediate/openssl.cnf \ -revoke /pki/csr/client/win10.crt

Generate CRL:

bash
openssl ca \ -config /pki/intermediate/openssl.cnf \ -gencrl \ -out /pki/intermediate/crl/intermediate.crl

KHUYẾN NGHỊ QUAN TRỌNG

OpenCA hiện tại:

  • gần như abandon
  • Perl dependency cũ
  • không phù hợp production
  • khó maintain
  • không hỗ trợ OpenSSL mới tốt

Nếu mục tiêu của bạn là:

“PKI lab + FTPS mutual TLS”

thì thực tế:

OpenSSL CA + Apache RA

là ổn định hơn OpenCA rất nhiều.

OpenCA chỉ nên dùng để:

  • nghiên cứu
  • demo historical PKI
  • lab architecture cũ
  • học RA workflow truyền thống.

مشاركة هذا السؤال والجواب