VPN'iniz gece saat 3'te bağlantılara yanıt verirken sertifikalarını imzalayan makine bir çekmecede kapalı durur. Sunucu sertifikasını doğrulayan bir istemci CA'nıza asla bağlanmaz, bu nedenle CA'nın herhangi bir bağlantı için erişilebilir olması gerekmez. Planlama gerektiren kısım bir sertifikanın verilmesi, yenilenmesi veya iptal edilmesi gereken gün kök anahtar kilitli kalırken.

Bir bağlantı gerçekte neyi doğrular

OpenVPN istemcisi bağlandığında, sunucunun yaprak sertifikasından zaten güvendiği bir CA sertifikasına kadar imza zincirini izler, geçerlilik penceresini kontrol eder ve profil öyle diyorsa iptal listesine bakar. Kök CA'nızı asla aramaz. Sunucu, istemci sertifikaları için bunun aynadaki görüntüsünü yapar. Bağlantı anında yalnızca yaprak, ara sertifika ve daha önce dağıttığınız güven paketi bulunur.

Gerçekte başarısız olan üç şeyden biridir: imzalama anahtarı verme sırasında kullanılamaz, bir iptal listesi eskimiştir veya istemcinin güven paketi sunucunun sunduğu zincirden daha eskidir. İlki bir süreç sorunudur; diğer ikisi dağıtım sorunlarıdır. Hiçbiri kök anahtarın çevrimiçi olmasını gerektirmez ve tünel kimlik doğrulaması için özel sertifika isteyen yönetilen bir VPN hizmeti yalnızca imzalama yetkisini sağlayıcıya taşır. Azure noktadan siteye tam tersini yapar: bir kök sertifika yüklersiniz ve altında imzalanan sertifikalar güvenilir sayılır, bu yüzden kimin imzaladığını, kimin doğruladığını ve bir sertifikanın nasıl erken geri çekildiğini sorun.

Kökü asla adres almayan bir ana makinede kurun

Çevrimdışı kök nadiren kullanılır: ara CA sertifikasını imzalamak ve daha sonra yenilemek veya iptal etmek için. Diğer her şey bir seviye aşağıda olur. Kök çalışmasını ağdan uzak tutulan bir makinede, mümkünse canlı bir sistemden yapın ve odada kimin olduğunu kaydedin. Komutlar OpenSSL 1.1.1 veya daha yenisini varsayar, çünkü -addext eski derlemelerde yoktur.

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out root.key
openssl req -x509 -new -key root.key -sha256 -days 7300 \
  -subj "/CN=Example VPN Root CA" -out root.crt \
  -addext "basicConstraints=critical,CA:TRUE" \
  -addext "keyUsage=critical,keyCertSign,cRLSign"

Ara sertifikayı imzalama ana makinesinde oluşturun ve yalnızca isteğini çevrimdışı makineye taşıyın. Kök bu isteği sıfır yol uzunluğuyla imzalar, böylece ara CA uç nokta sertifikalarını imzalayabilir ancak altında başka bir CA oluşturamaz. Bu tek uzantı, ele geçirilmiş bir imzalama ana makinesinin kökle eşdeğer bir yetki üretmesini engeller. ECDSA'yı yalnızca her istemci OpenVPN 2.4 veya daha yenisini çalıştırıyorsa kullanın; aksi halde RSA anahtarları üretin ve akışı aynı tutun.

openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out intermediate.key
openssl req -new -key intermediate.key -subj "/CN=Example VPN Intermediate CA" -out intermediate.csr
openssl x509 -req -in intermediate.csr -CA root.crt -CAkey root.key \
  -CAcreateserial -days 3650 -sha256 -extfile intermediate.ext -out intermediate.crt

intermediate.ext, basicConstraints=critical,CA:TRUE,pathlen:0, keyUsage=critical,keyCertSign,cRLSign ve authorityKeyIdentifier=keyid:always içerir. İmzalama ana makinesi yeniden bağlanmadan önce kök anahtarı kasasına geri koyun. Kökün ara sertifikayı iptal edebilmesi gerekiyorsa, openssl x509 -req yerine kök düzeyindeki index.txt karşısında openssl ca -config root.cnf -extensions intermediate_ca ile imzalayın, böylece seri numarası kaydedilir; ardından elde edilen kök listesini istemci profilinin içinde gönderin; orada dosya tabanlı crl-verify onu başlangıçta okur. İstemcilere iki CA sertifikasını da içeren bir paket gönderin; tek başına yaprak köke karşı doğrulanmaz.

Yaprakları aradan çıkarın, bir veritabanıyla

openssl x509 -req ile imzalamak, iptale ihtiyaç duyana kadar çalışır, çünkü hiçbir şey seri numarasını kaydetmez. Seri numarası, son kullanma ve iptal durumu tek bir veritabanında yaşasın diye ilk sertifikadan itibaren openssl ca kullanın. Veritabanı dosyalarını bir kez oluşturun ve yapılandırmayı onlara yönlendirin:

mkdir -p /etc/vpn-ca/intermediate/newcerts
touch /etc/vpn-ca/intermediate/index.txt
echo 1000 > /etc/vpn-ca/intermediate/serial
echo 1000 > /etc/vpn-ca/intermediate/crlnumber
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /etc/vpn-ca/intermediate
database = $dir/index.txt
new_certs_dir = $dir/newcerts
serial = $dir/serial
crlnumber = $dir/crlnumber
certificate = $dir/intermediate.crt
private_key = $dir/intermediate.key
default_md = sha256
default_days = 365
default_crl_days = 30
unique_subject = no
policy = policy_any
[ policy_any ]
commonName = supplied
[ server_cert ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = serverAuth
subjectAltName = @server_names
[ client_cert ]
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature
extendedKeyUsage = clientAuth
[ server_names ]
DNS.1 = vpn.example.com

Anahtar kullanım satırı bir ECDSA anahtarı varsayar; RSA için keyEncipherment ekleyin. Her istemciye kendi ortak adını verin, çünkü OpenVPN bağlantıyı o alandan tanır ve CN=vpn-client paylaşan iki dizüstü bilgisayar günlüklerde, client-config-dir kurallarında veya kullanıcı başına herhangi bir push'ta ayırt edilemez ve iptal kararını savunulabilir kılan atfı kaybedersiniz. Yaprağı şöyle verin ve doğrulayın:

openssl req -new -key alice.key -subj "/CN=alice-laptop" -out alice.csr
openssl ca -config intermediate.cnf -extensions client_cert -in alice.csr -out alice.crt -batch
openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt alice.crt

İmzalama anahtarını VPN ana makinesine kopyalamak yerine bir politika sınırının arkasında tutun: isteği kimlik doğrulayan, ortak adı izin listesine karşı denetleyen ve yalnızca sertifikayı döndüren küçük bir hizmet. Her seri numarasını kaydedin; günlük, bir sertifika ile onu isteyen kişi arasındaki tek bağlantıdır.

Kökü uyandırmadan iptali yayınlayın

İstemci sertifikalarını ara CA iptal eder, asla kök etmez. Kök listesi yalnızca bir ara CA yakıldığında önemlidir. Sunucuyu crl-verify ile ara listeye yönlendirin. Dosya tabanlı CRL hizmet başlangıcında yüklenir, bu yüzden her yeniden üretimden sonra yeniden yükleyin; dizin biçimi durumu bağlantı anında okur ve seri numarası başına bir dosyaya mal olur.

Aynı veritabanından iki komutla iptal edin ve yeniden üretin:

openssl ca -config intermediate.cnf -revoke /etc/vpn-ca/intermediate/newcerts/1001.pem
openssl ca -config intermediate.cnf -gencrl -out /etc/openvpn/crl.pem

Sonra saati izleyin. CRL bir sonraki güncelleme alanı taşır ve o tarih geçince doğrulayan taraf listeyi yok saymak yerine reddeder. default_crl_days = 30 ile aylık yeniden üretim pay bırakır; yıllık bırakmaz. Daha kısa yaprak ömürleri daha güvenilir kontroldür, çünkü iptal yalnızca listenin bakıldığı yerde geçerlidir.

Zinciri test edin, sonra töreni yazın

Tasarıma güvenmeden önce dört hatayı yeniden üretin. Zinciri openssl verify -CAfile ca-bundle.crt -untrusted intermediate.crt server.crt ile doğrulayın. Süresi dolmuş bir istemci sertifikasıyla bağlanın ve sunucunun reddettiğini doğrulayın. Bir test istemcisini iptal edin, yeniden yükleyin ve listenin yürürlüğe girdiğini doğrulayın. Bir ana makinenin saatini bir gün ileri alın, çünkü yanlış saat başka yerde geçerli görünen sertifikaları verebilir ve reddedebilir.

Çevrimdışı kök ancak belgeler varsa bir kontroldür: tören için iki adlı kişi, imzalanan her seri numarasının kaydı, makineden ayrı saklanan şifreli yedek ve yalıtılmış bir ana makinede geri yükleme testi. Aynı törende yedek bir ara CA imzalayın ki ölü bir imzalama ana makinesi sizi gece yarısı kökü açmaya zorlamasın.

Bitmiş demeden önce beş şeyi doğrulayın: kök anahtar ağa bağlı bir ana makinede değil, ara anahtar yalnızca imzalama ana makinesinde yaşıyor, istemci paketi iki CA sertifikasını taşıyor, CRL'nin gelecekte bir sonraki güncellemesi var ve zincirdeki her son kullanma için birinin takvim kaydı var. Biri eksikse, çevrimdışı görünen kurulum yalnızca belgelenmemiştir.

İlgili makaleler