Generowanie CSR oraz certyfikatów z poziomu Windowsa w oparciu o AD CS

To okazuje się być prostsze, niż mi się wydawało. Przykład, który będę przedstawiał jest najczęściej używanym – chodzi tutaj o wystawianie certyfikatów dla serwerów webowych. W poprzednich poradnikach pokazywałem jak to robić w oparciu o OpenSSL (wykorzystywałem tam Linux Subsystem for Windows), lecz tym razem pokażę jak to zrobić z poziomu MMC (Microsoft Management Console).

Generowanie CSR

CSR (Certificate Signing Request) jest po polsku dosłownie żądaniem podpisania certyfikatu. Aby wygenerować żądanie certyfikatu, musimy mieć klucz prywatny. MMC w ramach generowania MMC tworzy klucz prywatny dla danego CSR. Mając CSR możemy zlecić w urzędzie certyfikacji podpisanie certyfikatu. Następnie taki certyfikat należy zaimportować do miejsca, w którym generowaliśmy CSR. Kwestia klucza prywatnego, o której pisałem wcześniej jest kluczowa. Do prawidłowego działania serwera webowego potrzebujemy mieć:

  • certyfikat serwera,
  • certyfikat urzędu certyfikacji, który podpisał certyfikat (w przypadku, gdy urząd certyfikacji, który podpisał certyfikat nie jest głównym urzędem certyfikacji potrzebne są wszystkie nadrzędne certyfikaty podmiotu wystawiającego certyfikat) – taki certyfikat nazywa się łańcuchem (ang. chain),
  • klucz prywatny użyty do wygenerowania żądania podpisania certyfikatu.

Stąd jeśli maszyna z Windowsem nie jest hostem, na którym będzie wykorzystywany certyfikat, dla którego generujemy CSR lub serwer nie jest w stanie korzystać z magazynu certyfikatów Windowsa (wydaje mi się, że nginx na Windowsie działa tak samo jak na Linuksie, czyli wymaga wskazania ścieżki do pliku certyfikatu serwera, łańcucha i klucza prywatnego, to byłby dobry przykład).

Zabawę zaczynamy od otworzenia Zarządzaj certyfikatami komputerów. Tam, w Certyfikaty – komputer lokalny > Osobisty > Certyfikaty klikamy PPM i wybieramy Wszystkie zadania > Operacje zaawansowane > Utwórz żądanie niestandardowe….

Dajemy Dalej.

W tym menu opcje są dwie: jeśli mamy wdrożone AD CS (Active Directory Certificate Services) to możemy skorzystać z predefiniowanych szablonów z naszego urzędu certyfikacji. Jest to proste i przyjemne, ponieważ my musimy jedynie wypełnić szablon odpowiednimi danymi. Ten szablon ma po prostu uzupełnione parametry potrzebne dla certyfikatu, którego szablon wybierzemy. Ta opcja to Zasady rejestracji usługi Active Directory. W przypadku, gdy nie mamy AD CS lub po prostu chcemy ręcznie zdefiniować od zera parametry certyfikatu – możemy to zrobić poprzez opcję Kontynuuj bez zasad rejestracji. Po wyborze idziemy dalej.

Następnie możemy wybrać szablon certyfikatu, który chcemy wykorzystać do tworzenia CSR. W naszym wypadku będzie to Serwer sieci Web. Format żądania można zostawić w formacie PKCS #10. Idziemy dalej.

Następnie należy rozwinąć szczegóły zasad rejestracji i kliknąć Właściwości.

Następnie, w podmiocie musimy zdefiniować parametry, którymi ma się wyróżniać certyfikat. Najważniejsze parametry to nazwa pospolita (CN), Państwo (C), Miasto (L), Jednostka organizacyjna (OU), województwo/region (S), adres e-mail (E). Ponadto, należy zdefiniować nazwy alternatywne dla certyfikatu i najczęściej to będą nazwy DNS. W przypadku poniżej mam zdefiniowaną tylko 1 nazwę DNS: it.supra.tf wraz ze zdefiniowanymi parametrami podmiotu, którego reprezentuje ten certyfikat.

Następnie w karcie Ogólne powinniśmy zdefiniować przyjazną nazwę, powinna być taka sama jak nazwa pospolita.

Rozszerzeń nie musimy edytować – w przypadku opcji, którą wybrałem tutaj wszystko jest zdefiniowane, lecz pokażę jak powinien być zdefiniowany certyfikat dla serwera webowego. Gdybyśmy jednak zdecydowali się definiować wszystkie parametry rozszerzeń ręcznie, musimy mieć takie opcje zdefiniowane:

Na końcu, w ustawieniach klucza prywatnego musimy wybrać rozmiar klucza. W większości przypadków to będzie 2048 (z faktu, że wybrałem szablon z urzędu, długość klucza jest z góry narzucona). Tutaj też powinno się zaznaczyć opcję Klucz prywatny można eksportować po to, by móc po zaimportowaniu certyfikatu do MMC jakoś go wyeksportować z kluczem prywatnym do dalszego użycia.

Tutaj akurat pole jest wypełnione poprawnie, ale w przypadku typu klucza powinien być zdefiniowany typ Wymiana.

Mając to możemy zapisać plik i najlepiej to zrobić w formacie Base 64, bo możemy wykorzystać taki certyfikat zarówno w przystawce certification authority jak i w serwisie webowym do podpisywania certyfikatów.

Teraz możemy podpisać certyfikat.

Podpisywanie certyfikatu przez serwis webowy

Jeśli mamy zainstalowaną rolę Rejestracja w sieci Web dla urzędu certyfikacji, możemy połączyć się z usługą webową w celu podpisania certyfikatu przez adres http://<fqdn-ca>/certsrv, w moim przypadku http://dc1.serba.local/certsrv. Aby podpisać certyfikat, musimy zalogować się na konto uprawnione do wystawiania certyfikatów. Na pewno takim kontem będzie konto Administrator. Na początku należy wybrać Żądanie certyfikatu.

Następnie należy wybrać zaawansowane żądanie certyfikatu.

Zamiast tego menu może być czasami takie:

Wybieramy opcję Prześlij żądanie certyfikatu, używając pliku CMC lub PKCS #10 szyfrowanego algorytmem base-64 lub prześlij żądanie odnowienia, używając pliku PKCS #7 szyfrowanego algorytmem base-64.

Następnie należy wkleić zawartość CSR (to jest plik tekstowy, można go otworzyć dowolnym edytorem tekstu) do pola Zapisane żądanie i wybieramy Szablon certyfikatuSerwer sieci Web. Po tym przechodzimy dalej i zapisujemy certyfikat w formacie Base-64.

Ta opcja jest super, bo po prostu działa łatwo i szybko. Poza tym ta opcja jest dobra jeśli korzystamy z klucza prywatnego oraz CSR tworzonych w OpenSSL. Co jeśli nie możemy z takiej stronki skorzystać (np. nie możemy postawić serwera webowego na hoście, na którym jest urząd certyfikacji, bo na nim coś pracuje na porcie 80/443)? Wtedy możemy skorzystać z podstawki MMC.

Podpisywanie certyfikatu przez przystawkę w MMC

To jest dosyć proste – otwieramy przystawkę, klikamy na nasz urząd certyfikacji PPM i wybieramy Wszystkie zadania > Prześlij nowe żądanie…, a następnie wskazujemy plik CSR.

Jeśli wszystko jest w porządku (w moim przypadku tak jest, od razu pojawi się okienko do zapisania certyfikatu.

W ten sposób mamy podpisany certyfikat.

Stworzyłem CSR przez OpenSSL, lecz nie mogę podpisać certyfikatu przez MMC, dlaczego? Nie mam stronki do podpisywania certyfikatów.

To dlatego, bo CSR nie zawiera przeznaczenia certyfikatu, czyli do czego on jest. Przynajmniej tak jest najczęściej i tak było w moim przypadku. Rozwiązanie jest takie, by wykonać podpisanie certyfikatu przez Wiersz poleceń z uprawnieniami administratora. Polecenie jest następujące:

certreq -Submit -Attrib "CertificateTemplate:WebServer" -Config "&lt;fqdn-ca>\&lt;nazwa-ca>" nasz-plik.csr

W moim przypadku byłoby to:

certreq -Submit -Attrib "CertificateTemplate:WebServer" -Config "dc1.serba.local\serba-DC1-CA" nasz-plik.csr

W parametrze -Attrib określa się szablon certyfikatu poprzez distinguished name szablonu, nie przez nazwę przyjazną szablonu. Ten przykład jest dla serwera sieci Web. Ten przykład zakłada, że jesteśmy w katalogu, który zawiera nasz-plik.csr. Po wykonaniu polecenia jeśli wszystko jest okej, otworzy nam się okienko, w którym możemy zapisać podpisany certyfikat.

Importowanie podpisanego certyfikatu

W obu przypadkach certyfikat, który otrzymamy mniej więcej wygląda tak:

Aby go importować, należy na komputerze, na którym generowaliśmy CSR go zainstalować poprzez Zainstaluj certyfikat… lub importując certyfikat będąc w osobistym magazynie certyfikatów komputera (skorzystałem z tej opcji):

Następnie należy iść dalej.

Znowu dalej.

Znowu dalej. Właśnie tam ma certyfikat trafić.

I to tyle, na koniec trzeba zamknąć kreator klikając Zakończ.

Po wejściu w certyfikaty komputerów tym razem mamy już podpisany certyfikat w certyfikatach osobistych (widać, że ma klucz prywatny!):

Po tym możemy go wyeksportować, by go gdzieś indziej wykorzystać.

Eksport certyfikatu w celu dalszego użycia

Zaczynamy klikając prawym na certyfikat, następnie Wszystkie zadania > Eksportuj….

Klikamy dalej.

Następnie wybieramy opcję Tak, eksportuj klucz prywatny.

Tutaj pozostawiamy takie opcje, jakie są.

Następnie należy zaznaczyć opcję Hasło oraz wpisać hasło dwukrotnie w pola. Ponadto zalecam wybrać szyfrowanie AES256-SHA256. Po tym idziemy dalej.

Na końcu musimy zapisać plik certyfikatu.

Pod koniec mamy podsumowanie, klikamy Zakończ i cieszymy się wyeksportowanym certyfikatem.

Mamy certyfikat, ale co możemy z nim dalej zrobić?

Zaimportować. 😊 Tak na poważnie – to zależy od tego, do czego chcemy ten certyfikat zaimportować, bo nie każdy serwer WWW akceptuje certyfikaty w formacie PKCS #12 (PFX). W większości przypadków będziemy musieli z tego certyfikatu wyeksportować plik certyfikatu i klucza prywatnego i z tym pomoże nam OpenSSL. Możemy z niego w Windowsie korzystać instalując binarki OpenSSL lub korzystają na Windowsie 10 z Linux Subsystem for Windows. Przyzwyczaiłem się do tego drugiego rozwiązania, ale droga naprawdę w tym przypadku nie ma znaczenia. Mając plik certyfikat.pfx rozwiązanie jest następujące:

Eksport klucza prywatnego:

openssl pkcs12 -in certyfikat.pfx -nocerts -out key.pem -nodes
Enter Import Password:

Eksport certyfikatu:

openssl pkcs12 -in certyfikat.pfx -nokeys -out cert.pem -nodes
Enter Import Password:

Z faktu, że plik PFX był zabezpieczony hasłem, musiałem je podać. W innym wypadku nie ma takiego pytania i po prostu to, co nas interesuje jest eksportowane. Hasło z klucza prywatnego jest usunięte, lecz w pliku jest nagłówek:

Bag Attributes
    Microsoft Local Key set: &lt;No Values>
    localKeyID: 01 00 00 00 
    Microsoft CSP Name: Microsoft RSA SChannel Cryptographic Provider
    friendlyName: te-WebServer-fbedaf0e-62a3-4c9e-baa1-bfc85280d441
Key Attributes
    X509v3 Key Usage: 10 

Jest on niepotrzebny w przypadku linuksowych usług. Nie wiem jak wygląda to z tymi dotyczącymi Windowsa.

Jestem konsolowcem, nie lubię GUI i lubię robić wiele rzeczy szybko za jednym zamachem, jak zrobić wszystko z konsoli?

W takiej sytuacji można skorzystać z narzędzia certreq w Windowsie, które działa mniej więcej tak samo jak to, co robiliśmy wyżej przez GUI. Na początku, by ułatwić sobie pracę powinniśmy mieć szablon, który umożliwi nam łatwe określenie certyfikatu (tutaj przykład dla innego certyfikatu, nazwa to stormshield.stormshield.local i CA to Stormshield Root CA):

[Version]
Signature="$Windows NT$"

[NewRequest]
;w tym polu określamy dane certyfikatu
Subject = "C=PL, O=it.supra.tf, CN=stormshield.stormshield.local, L=Tychy, S=śląskie, E=radoslaw@serba.ovh, OU=IT"
KeySpec = 1
KeyLength = 2048
;klucz jest eksportowalny
Exportable = TRUE
MachineKeySet = TRUE
SMIME = False
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
KeySpec = AT_KEYEXCHANGE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0
HashAlgorithm = SHA256

;to jest opcjonalne, ale możemy wcześniej zdefiniować nazwę szablonu, który mamy w urzędzie certyfikacji tak samo jak w kreatorze w GUI
[RequestAttributes]
CertificateTemplate=WebServer

;to jest obowiązkowe - musimy określić do czego będzie służył ten certyfikat
[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1 ; Server Authentication

;to jest opcjonalne, ale jeśli nie chcemy mieć w Chrome błędów certyfikatu to uznałbym to jako obowiązkowe, dzięki temu możemy określić jakie adresy w przeglądarce są akceptowalne dla tego certyfikatu
[Extensions]
2.5.29.17 = "{text}"
_continue_ = "DNS=stormshield.stormshield.local"
_continue_ = "IPAddress=192.168.40.1&amp;"

Mając taki szablon zapisany w pliku (w moim przypadku w config-csr.txt) można utworzyć CSR za pomocą polecenia:

PS C:\Users\Administrator\Desktop> certreq.exe -new .\config-csr.txt .\request.csr
Zasady rejestracji usługi Active Directory
  {FA379C50-2A4F-409A-8F9E-B714B9E69E35}
  ldap:

CertReq: Request Created

Następnie na serwerze, gdzie jest urząd certyfikacji taki certyfikat podpisujemy:

PS C:\Users\Administrator\Desktop> certreq -Submit -Config "dc1.stormshield.local\Stormshield Root CA" .\request.csr
RequestId: 6
RequestId: "6"
Certificate retrieved(Issued) Issued

Potem na hoście, z którego generowaliśmy CSR importujemy certyfikat:

PS C:\Users\Administrator\Desktop> certreq -accept .\certyfikat.cer
Installed Certificate:
  Serial Number: 5f0000000671797c1d3d008ff8000000000006
  Subject: E=radoslaw@serba.ovh, CN=stormshield.stormshield.local, OU=IT, O=it.supra.tf, L=Tychy, S=śląskie, C=PL (Nazwa DNS=stormshield.stormshield.local, Adres IP=192.168.40.1)
  NotBefore: 22.08.2020 12:25
  NotAfter: 22.08.2022 12:25
  Thumbprint: 6bfaa5aee37a34593dad1f034f25514a3497ea58

Na końcu musimy sobie ten certyfikat znaleźć i możemy go wyeksportować w formacie PFX. Szukamy certyfikatu za pomocą polecenia:

Get-ChildItem -Path cert:\localMachine\my


   PSParentPath: Microsoft.PowerShell.Security\Certificate::localMachine\my

Thumbprint                                Subject
----------                                -------
D13B5A05111E4FCE19CB400E2C425E9B763D7337  CN=dc1.stormshield.local
6BFAA5AEE37A34593DAD1F034F25514A3497EA58  E=radoslaw@serba.ovh, CN=stormshield.stormshield.local, OU=IT, O=it.supra.tf, L=Tychy, S=śląskie, C=PL
1D6B16F9C60871F370574B2830EAC15276E9528E  CN=Stormshield Root CA, DC=stormshield, DC=local

Tutaj możemy zobaczyć, że certyfikat, który nas interesuje ma odcisk palca 6BFAA5AEE37A34593DAD1F034F25514A3497EA58. Dopisujemy go do ścieżki w Get-ChildItem, dzięki czemu wyszukanie obiektu wskazuje na 1 obiekt:

PS C:\Users\Administrator\Desktop> Get-ChildItem -Path cert:\localMachine\my\6BFAA5AEE37A34593DAD1F034F25514A3497EA58


   PSParentPath: Microsoft.PowerShell.Security\Certificate::localMachine\my

Thumbprint                                Subject
----------                                -------
6BFAA5AEE37A34593DAD1F034F25514A3497EA58  E=radoslaw@serba.ovh, CN=stormshield.stormshield.local, OU=IT, O=it.supra.tf, L=Tychy, S=śląskie, C=PL

Teraz taki obiekt należy przypisać do zmiennej. Od razu można przygotować sobie hasło do eksportu certyfikatu, które będzie potrzebne:

$certificate = Get-ChildItem -Path cert:\localMachine\my\6BFAA5AEE37A34593DAD1F034F25514A3497EA58
$mypwd = ConvertTo-SecureString -String "Zaq12wsx!" -Force -AsPlainText

I ostatecznie możemy wyeksportować certyfikat:

PS C:\Users\Administrator\Desktop> Export-PfxCertificate -CryptoAlgorithmOption AES256_SHA256 -ChainOption BuildChain -Password $mypwd -Cert $certificate -FilePath ./certyfikat.pfx


    Directory: C:\Users\Administrator\Desktop


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       22.08.2020     12:46           4636 certyfikat.pfx

Certyfikaty wystawiają mi się na krótko (1-2 lata), jak to zmienić?

Należy w rejestrze zmienić w gałęzi HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\Stormshield Root CA zmienić klucz ValidityPeriodUnits na większą wartość, lecz ta nie może być większa od okresu, na które jest wystawiony certyfikat dla CA (domyślnie 5 lat), dlatego ja ustawiłem 4. Po zapisaniu zmian należy zrestartować serwer i po tym można wystawiać certyfikaty na 4 lata.

Dobre reflinki do robienia fajnych rzeczy z konsoli w tym temacie:

Zmiana domyślnej jednostki organizacyjnej OU dla użytkowników i komputerów w Active Directory

Domyślnie wszystkie komputery trafiają w drzewku do folderu Computers, a użytkownicy do folderu Users. Takie coś można zmienić i do tego służą polecania redircmp i redirusr. W moim przypadku chcę, aby wszystko trafiało musimy określić DN (distinguished name) dla OU (organizational unit, jednostka organizacyjna) i najlepiej zrobić to poprzez przystawkę Użytkownicy i komputer usługi Active Directory z zaznaczoną opcją Widok > Opcje zaawansowane. Wtedy możemy otworzyć właściwości obiektu, otworzyć zakładkę Edytor atrybutu i znaleźć atrybut distinguishedName. Taką wartość użyjemy w poleceniu.

Dla użytkowników:

redirusr "OU=it.supra.tf,DC=serba,DC=local"

Dla komputerów:

redircmp "OU=it.supra.tf,DC=serba,DC=local"

Polecam używać cudzysłowie – szczególnie w przypadku nazw ze spacją w środku.

Rozmazane tekstury w Team Fortress 2

Pierwszy raz o tym słyszałem od pntna i dopiero teraz zauważyłem korzyści benefity korzystania z tego. Nie wiem jak to wygląda pod kątem zwiększania FPSów, ale na pewno zwiększa to widoczność w trakcie grania…w sensie ten myk, który jest opisany tutaj. Oczywiście jest to możliwe tylko w przypadku kart NVIDIA.

Na początku trzeba pobrać NVIDIA Inspector z tej strony. Po pobraniu należy paczkę rozpakować i odpalić program nvidiaProfileInspector.exe, w Profiles wybrać Team Fortress 2, znaleźć w sekcji 4 – Texture Filtering opcję Texture filtering - LOD Bias (DX) i wybrać z listy opcję +3.0000, tak jak na zrzucie poniżej:

Po tym należy wyeksportować profil w taki sposób, jak przedstawiłem powyżej oraz zapisać plik np. na pulpicie. Będzie wyglądał mniej więcej tak:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfProfile>
  <Profile>
    <ProfileName>Team Fortress 2</ProfileName>
    <Executeables>
      <string>team fortress 2/hl2.exe</string>
    </Executeables>
    <Settings>
      <ProfileSetting>
        <SettingNameInfo>Texture filtering - LOD Bias</SettingNameInfo>
        <SettingID>7573135</SettingID>
        <SettingValue>120</SettingValue>
      </ProfileSetting>
    </Settings>
  </Profile>
</ArrayOfProfile>

Jeśli w SettingID mamy wartość 7573135 i w SettingValue 120, nie musimy nic robić. W innym wypadku należy zmienić SettingValue na 120, zapisać plik i zaimportować konfigurację. Robi się to za pomocą opcji poniżej:

Na koniec w sekcji 3 – Antyaliasing należy zmienić opcję Antialiasing – Transparency Supersampling na 0x00000008 AA_MODE_REPLAY_MODE_ALL i kliknąć u góry Apply changes.

Gotowe.

Problem białej nakładki Mumble w Team Fortress 2

Mnie to też wkurzało przez bardzo długi czas, ale udało mi się rozwiązać ten problem, ale na tym obrazku może to nie jest aż tak dobrze widoczne, więc pokażę problem z bliska:

Problem występuje w sytuacji, gdy używa się DirectX 9 (parametr -dxlevel 90, -dxlevel 92 lub -dxlevel 95). Parametr -d3d9x pomaga, ale tylko w przypadku używania DirectX 8.1 (parametr -dxlevel 81). Ten parametr nie ma znaczenia w przypadku DirectX 9.x.

Okej, więc najważniejsze rzeczy, które trzeba mieć ustawione, by wszystko było git to:

  • nakładka musi być włączona w ustawieniach Mumble,
  • granie w trybie pełnoekranowym,
  • niewpisany parametr -dxlevel w parametrach startowych (by zmieniać wersje DirectX, wystarczy miec raz wpisany parametr przy starcie gry, potem można go usunąć),
  • niezmienianie parametru mat_antialias. W moim przypadku to było problemem, ponieważ miałem tą zmienną w autoexec.cfg, co powodowało ustawianie tej wartości przy każdym starcie gry. Nie można zmieniać tej zmiennej także przez podanie jej w parametrach startowych gry, tzn. wpisanie +mat_antialias X (X – jakaś wartość).

Jeśli używasz MasterComfig – nie powinno być problemu. MasterComfig ustawia mat_antialias, ale ustawia to tylko raz, więc po restarcie nie powinno być problemu. Jeśli problemy się pojawiają – usuń MasterComfig i sprawdź czy nie masz gdzieś w configu tej zmiennej.

Efekt wygląda tak:

CentOS/RHEL/Oracle Linux – system po przeniesieniu na inną maszynę nie startuje (problem z Dracut)

Problem wygląda tak i występuje w CentOS 7/Red Hat Enterprise 7/Oracle Linux/podobne:

Rozwiązaniem jest wygenerowanie nowszych plików do Dracuta. Można to zrobić za pomocą płyty ratunkowej do odpowiedniej dystrybucji. W tym przypadku będę bazował na Oracle Linuxie 7.6. Po starcie płyty ratunkowej na maszynie, na której jest problem należy odpalić shell, w którym będziemy wykonywać polecenia wybierając opcję 1 z menu, tak jak tutaj:

Następnie jeśli nasza partycja zostanie wykryta, należy wykonać polecenie chroot /mnt/sysimage i od tego momentu jesteśmy w stanie pracować w systemie na naszym dysku, który się nie odpala.

Następnie należy wykonać polecenie:

dracut -f /boot/initramfs-4.14.35-1844.2.5.el7uek.x86_64.img 4.14.35-1844.2.5.el7uek.x86_64

Oczywiście w poleceniu jest wersja kernela, która jest aktualnie na serwerze, który obsługiwałem. Tutaj trzeba dopasować własną wersję 😊

Po tym wystarczy zamknąć shell poleceniem exit i zrestartować serwer poleceniem reboot i próbując odpalić system. Efekt jest taki:

Odpalanie FortiGate z zapasowej partycji po nieudanej aktualizacji

Jakiś czas zrobiłem update FortiOS u klienta do z 6.4.0 do 6.4.2 na FortiGate 100F i efekt był taki, że urządzenie się co chwile restartowało. Byłem zdziwiony, w końcu na moim urządzeniu nie było takiego problemu. W takiej sytuacji należy się podłączyć poprzez port CONSOLE w urządzeniu przez taki kabel:

Takie kable (konwerter RS-232 na USB + kabel RS-232 <-> RJ-45) z można dostać na Allegro. Na Windowsie 10 sterowniki zainstalują się same. Potem należy sprawdzić numer portu COM dla interfejsu szeregowego:

Potem należy wskazać ten port w PuTTY (ja korzystam akurat z KiTTY):

Po połączeniu widzimy konsolę i od razu widać w czym jest problem:

FortiGate-100F (23:49-05.21.2019)
Ver:05000008
Serial number: FG100FTK69696969
CPU: 1400MHz
Total RAM: 4 GB
Initializing boot device...
Initializing MAC... nplite#0
Please wait for OS to boot, or press any key to display configuration menu......

Booting OS...
Initializing firewall...

System is starting...
Starting system maintenance...
Scanning /dev/mmcblk0p2... (100%)
Scanning /dev/mmcblk0p3... (100%)
Unable to handle kernel NULL pointer dereference at virtual address 00000038
pgd = ffffffc0d9df0000
[00000038] *pgd=00000000c57b4003, *pud=00000000c57b4003, *pmd=0000000000000000
Internal error: Oops: 96000006 [#1] SMP

Modules linked in:
 linux_user_bde(P)
 linux_kernel_bde(P)
 filter4

task: ffffffc01c824080 ti: ffffffc0c6ccc000 task.ti: ffffffc0c6ccc000
PC is at vs_update+0x50/0x208
LR is at vs_update+0x3c/0x208
pc : [&lt;ffffffc000474918>] lr : [&lt;ffffffc000474904>] pstate: 60000145
sp : ffffffc0c6ccf9d0
x29: ffffffc0c6ccf9d0 x28: 0000000000000026
x27: ffffffc00048a000 x26: 0000000000000000
x25: ffffffc0cd87c000 x24: 0000000000000000
x23: ffffffc0cd87d170 x22: ffffffc0c6ccfab8
x21: ffffffc0d81e5000 x20: 0000000000000000
x19: ffffffc0c6ccfb0c x18: 0000000000000320
x17: 0000007f817c3610 x16: ffffffc00013e238
x15: ffffffffffffffff x14: ffffffffffffffff
x13: ffffffffffffffff x12: 0000000000000008
x11: 0101010101010101 x10: ff3073716e6efeff
x9 : 7f7f7f7f7f7f7f7f x8 : fefefefefefeff6a
x7 : 0080808080808080 x6 : 0000000000000000
x5 : 8080808080808000 x4 : 00000000e9120000
x3 : ffffffc0c6ccfb0c x2 : 0000000000001170
x1 : 0000000000000000 x0 : 0000000080000000

BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH
BLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAHBLAH

Exception stack(0xffffffc0c6ccf7f0 to 0xffffffc0c6ccf910)
f7e0:                                     c6ccfb0c ffffffc0 00000000 00000000
f800: c6ccf9d0 ffffffc0 00474918 ffffffc0 60000145 00000000 0009d4d0 ffffffc0
f820: c6ccf880 ffffffc0 00020020 ffffffbf 00000038 00000000 00000010 00000000
f840: c28f5c29 8f5c28f5 00000001 00000000 006bd6d0 00000001 00000000 00000000
f860: c6ccf960 ffffffc0 000fed78 ffffffc0 000000d0 00000000 00000002 00000000
f880: 006a4280 ffffffc0 00000000 00000000 00000000 00000000 006bd4d0 ffffffc0
f8a0: e1c00800 ffffffc0 271ae705 1b75b31a 80000000 00000000 00000000 00000000
f8c0: 00001170 00000000 c6ccfb0c ffffffc0 e9120000 00000000 80808000 80808080
f8e0: 00000000 00000000 80808080 00808080 fefeff6a fefefefe 7f7f7f7f 7f7f7f7f
f900: 6e6efeff ff307371 01010101 01010101
[&lt;ffffffc000083374>] el1_da+0x24/0x78
[&lt;ffffffc0004731a4>] sw_aggerate_d_netdevice.isra.2+0x5fc/0x638
[&lt;ffffffc000473834>] __sw_net_ioctl+0x3e4/0x5d0
[&lt;ffffffc000473a54>] sw_net_ioctl+0x34/0x58
[&lt;ffffffc0004005d0>] inet_ioctl+0x228/0x268
[&lt;ffffffc000391be8>] sock_ioctl+0x1e8/0x250
[&lt;ffffffc00013df6c>] do_vfs_ioctl+0x2dc/0x5a8
[&lt;ffffffc00013e290>] sys_ioctl+0x58/0xa8
Rebooting in 5 seconds..

Rozwiązanie jest dosyć proste: należy zrestartować urządzenie i po restarcie na samym starcie firmware nacisnąć szybko jakiś przycisk, a następnie wybrać opcję [B]: Boot with backup firmware and set as default. To spowoduje start poprzedniej wersji FortiOS z zapasowej partycji:

[&lt;ffffffc000391be8>] sock_ioctl+0x1e8/0x250
[&lt;ffffffc00013df6c>] do_vfs_ioctl+0x2dc/0x5a8
[&lt;ffffffc00013e290>] sys_ioctl+0x58/0xa8
Rebooting in 5 seconds..

FortiGate-100F (23:49-05.21.2019)
Ver:05000008
Serial number: FG100FTK69696969
CPU: 1400MHz
Total RAM: 4 GB
Initializing boot device...
Initializing MAC... nplite#0
Please wait for OS to boot, or press any key to display configuration menu...

[C]: Configure TFTP parameters.
[R]: Review TFTP parameters.
[T]: Initiate TFTP firmware transfer.
[F]: Format boot device.
[I]: System information.
[B]: Boot with backup firmware and set as default.
[Q]: Quit menu and continue to boot.
[H]: Display this list of options.

Enter C,R,T,F,I,B,Q,or H:

Loading backup firmware from boot device...


Booting OS...
.Initializing firewall...

System is starting...
Starting system maintenance...
Scanning /dev/mmcblk0p1... (100%)
Scanning /dev/mmcblk0p3... (100%)


FortiGate-100F login: admin
Password:
Welcome !

FortiGate-100F #

Ręczne usuwanie sterowników z systemu Windows 10

Niejednokrotnie jest tak, że ma opcji, by sprzęt zadziałał. Zainstalowałeś/aś sterowniki ze strony producenta, próbujesz skorzystać z tych systemowych, kombinujesz z aktualizacją i nic się nie da. Takie coś miałem ze sterownikami do karty dźwiękowej CREATIVE Sound Blaster Omni Surround 5.1 (które ogólnie są spoko, gdyby nie ten pieprzony sterownik) i sytuacja wyglądała tak:

Zmiana sterownika dla urządzenia

Jeśli chcesz rozwiązać problem – musisz zmienić sterownik.

W ten sposób urządzenie jest wykrywane jako nieskonfigurowane:

Dlatego kliknąłem Aktualizuj sterownik… by zmienić sterownik, którego chcę używać dla tego urządzenia.

Jeśli system wykryje sterowniki w systemie – zamiast listy typów urządzeń pokaże od razu pasujące sterowniki. W moim przypadku sterownik na dole (Urządzenie audio USB) było jedynym działającym, więc go wybrałem.

I voilà! Urządzenie działa. Teraz pozbądźmy się wadliwych sterowników z systemu.

Usuwanie zbędnych sterowników z systemu

Tutaj z pomocą przychodzi nam narzędzie Driver Store Explorer, które można stąd pobrać. Wystarczy go otworzyć, znaleźć sterownik na liście szukając po kategorii sterownika oraz po wydawcy, a następnie kliknąć prawym na sterownik i wybrać Delete.

Z faktu, że miałem takie dwa sterowniki, to samo zrobiłem z drugim:

Jak widać, tym razem przy zmianie sterownika nie mam niczego dodatkowego na liście, czyli w sumie to jest tak jak powinno być.