04 lutego 2015

Nietypowy certyfikat dla puli Lyncowej

Niedawno miałem ciekawy problem (LS Protocol Stack event 14501 i 14428), dotyczący koegzystencji serwerów Lync z infrastrukturą Cisco CUCM/VCS. Pomimo faktu wygenerowania certyfikatów przez ten sam wewnętrzny urząd połączenia TLS pomiędzy serwerami zgłaszały błędy. Znalazłem w sieci podobny przypadek, jednak przygotowanie certyfikatu dla takiego scenariusza (domyślnie certyfikat serwera Lync jest konfigurowany tylko dla certyfikacji serwerowej (OID 1.3.6.1.5.5.7.3.1), a w tym wypadku jest wymagana dodatkowo certyfikacja kliencka (OID 1.3.6.1.5.5.7.3.2). Jak to zrobić najprościej? Domyślne metody nie pozwalają na taką operację – ani kreator certyfikatów z Lync Deployment Wizarda ani tym bardziej zawarty w IIS, formatka webowa urzędu certyfikacyjnego również nie pozwala na utworzenie takiego certyfikatu. Jednak narzędzia linii komend certreq/certutil mają bogate możlwości, które nam to ułatwią. W tym celu musimy sobie przygotować plik inf, zgodnie z artykułem “How to request a certificate with a Custom SAN”. Pik powinien zawierać wpisy jak poniżej:

[Version]
Signature="$Windows NT$"

[NewRequest]
Subject = "CN=lync.pepug.org"  
Exportable = TRUE                   ; Private key is exportable
KeyLength = 2048                    ; Common key sizes: 512, 1024, 2048, 4096, 8192, 16384
KeySpec = 1                         ; AT_KEYEXCHANGE
KeyUsage = 0xA0                     ; Digital Signature, Key Encipherment
MachineKeySet = True                ; The key belongs to the local computer account
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = CMC

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1 ;Server Authentication
OID=1.3.6.1.5.5.7.3.2 ;Client Authentication

[Extensions]
2.5.29.17 = "{text}"
_continue_ = "dns=lync.pepug.org&"
_continue_ = "dns=fe1.lab.pepug.org&"
_continue_ = "dns=fe2.lab.pepug.org&"
_continue_ = "dns=lsweb.pepug.org&"
_continue_ = "dns=lyncdiscover.pepug.org&"
_continue_ = "dns=lyncdiscoverinternal.pepug.org&"
_continue_ = "dns=dialin.pepug.org&"
_continue_ = "dns=meet.pepug.org&"
_continue_ = "dns=sip.pepug.org"

[RequestAttributes]
CertificateTemplate = WebServer1

Dwa słowa komentarza – w sekcji EnhancedKeyUsageExtension wskazujemy, że ma być obsługiwana zarówno opcja Server jak i client Authentication. Ponieważ chcemy certyfikat zainstalować na kilku serwerach w puli, więc wybieramy opcję zezwolenia na eksport klucza prywatnego. W sekcji RequestAttributes wskazujemy wykorzystywany w naszej firmie szablon tworzenia certyfikatu, jednak najciekawszy zapis zawiera sekcja Extensions – ponieważ certyfikat serwera Lync musi zawierać zarówno nazwy hostów jak i szereg innych nazw wykorzystywanych przez Lynca, więc wykorzystujemy specyficzny zapis z użyciem konkretnego identyfikatora dla certyfikatów SAN (zapis działa począwszy od Windows 2008).

Wygląda to trochę nietypowo, ale działa. Teraz tylko pozostaje utworzenie certyfikatu z użyciem narzędzia certreq:

Na jednym z serwerów wykonujemy komendę:

certreq –new certLync.inf certLync.req

Następnie po skopiowaniu pliku (ewentualnie zdalnie, jeżeli jest taka możliwość) na serwer z urzędem certyfikacji generujemy certyfikat:

certreq –submit certLync.req certLync.cer

Teraz pozostaje tylko zainstalowanie certyfikatu:

certreq -accept certLync.cer

i przypisanie go do usług serwera FrontEndowego (no i po wyeksportowaniu do pfx-a instalacja na drugim serwerze w puli).


Po restarcie usług komunikacja pomiędzy systemami zaczyna działać poprawnie.

Brak komentarzy: