# Скачиваем софт по ссылкам ниже # https://es.ukrtb.ru/nextcloud/s/xwBAsTqWqT8QyBT/download/OpenSSL.msi # https://es.ukrtb.ru/nextcloud/s/PoxqfCWkXtrdgw7/download/putty.msi # https://es.ukrtb.ru/nextcloud/s/ybKx8rpJX8fbZtS/download/WinSCP.exe # Делаем ручное подключение (Астра) # plink iwtm@192.168.1.10 -pw xxXX1234 # Запускаем скрипт # Set-ExecutionPolicy Unrestricted -force; cd ~\Desktop\; .\tm-ssl.ps1 # Павершелл следует запускать от имени администратора Write-Host "`nПроверка привелегий администратора:" if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(` [Security.Principal.WindowsBuiltInRole] "Administrator")) { Write-Warning "Запустите павершелл от имени администратора.`n" Break } else { Write-Host "Скрипт запущен от имени администратора.`n" -ForegroundColor Green } # Остановка скрипта при ошибке $ErrorActionPreference = "Stop" # Указываем пути $path = "C:\Program Files\OpenSSL-Win64\bin" $hpath = "$(pwd)\tm-ssl" $wpath = "C:\Program Files (x86)\WinSCP" $lpath = "$hpath\linux" $cpath = "$hpath\certs" $dpath = "tmp" # Названия сертификатов $root = "root" $intermediate = "intermediate" $server = "iwtm" $client = "arm" # Данные для линупса $cnf = "iw" if (!($ip = Read-Host "Введите IP IWTM [192.168.1.10]")) { $ip = "192.168.1.10" } if (!($luser = Read-Host "Введите пользователя IWTM [iwtm]")) { $luser = "iwtm" } if (!($lpassword = Read-Host "Введите пароль IWTM [xxXX1234]")) { $lpassword = "xxXX1234" } # Промежуточный = серверный if (!($servint = Read-Host "`nСделать серверный сертификат промежуточным [y]")) { $servint = "y" } if ($servint -eq "y"){ $intermediate = $server } # Данные для сертификата if (!($country = Read-Host "`nВведите страну [RU]")) { $country = "RU" } if (!($state = Read-Host "Введите штат [RB]")) { $state = "RB" } if (!($city = Read-Host "Введите город [Ufa]")) { $city = "Ufa" } if (!($corp = Read-Host "Введите организацию [UKRTB]")) { $corp = "UKRTB" } if (!($unit = Read-Host "Введите отдел [IT]")) { $unit = "IT" } if (!($hostname = Read-Host "Введите хостнейм [iwtm]")) { $hostname = "iwtm" } if (!($domain = Read-Host "Введите домен [demo.lab]")) { $domain = "demo.lab" } if (!($password = Read-Host "Введите пароль .p12 [xxXX1234]")) { $password = "xxXX1234" } $site = "$hostname.$domain" # Конфиг опенссл $config = " [ ca ] default_ca = CA_default [ CA_default ] certs = ./ serial = serial database = index new_certs_dir = ./ certificate = $root.crt private_key = $root.key default_days = 36500 default_md = sha256 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] commonName = supplied countryName = optional stateOrProvinceName = optional organizationName = optional organizationalUnitName = optional emailAddress = optional [ req ] input_password = $password prompt = no distinguished_name = default default_bits = 2048 default_keyfile = priv.pem default_md = sha256 req_extensions = v3_req encyrpt_key = no x509_extensions = v3_ca [ default ] commonName = default [ v3_ca ] subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer basicConstraints = critical,CA:true [ v3_intermediate_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign subjectAltName = @alt_names [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash subjectAltName = @alt_names [ alt_names ] DNS.1 = $site IP.1 = $ip" # Удаляем файлы, которые могли остаться от прошлого запуска скрипта cd $path Remove-Item * -Include *.sh,*.cnf,*.key,*.csr,*.crt,*.p12,*.pem,seria*,inde* -Force if (Test-Path "$hpath") { rm -r -fo "$hpath" } # Создаём файл с номером и индексом скрипта, конфиг опенссл и скрипт для линукса out-file -append -encoding utf8 "index" write-output "01" | out-file -append -encoding ASCII "serial" write-output $config | out-file -append -encoding utf8 "$cnf.cnf" # Продолжение скрипта при ошибке $ErrorActionPreference = "Continue" # Обработка ошибок $TempFile = New-TemporaryFile function Error-Break{ # Если в файлы нет Signature ok + MAC + он не пустой, то if выполняется if ((!(Select-String -Path "$TempFile" -Pattern 'Signature ok') -and (!(Select-String -Path "$TempFile" -Pattern 'MAC'))) -xor ([String]::IsNullOrWhiteSpace((Get-content $TempFile)))){ # Вывод ошибок $err = Get-Content -Path $TempFile Write-Error "$err" # break break } } # Имя сертификата $name = $root # Создаём корневой ключ .\openssl genrsa -out "$root.key" 2> $TempFile; Error-Break # Создаём корневой самоподписанный сертификат .\openssl req -x509 -new -nodes -key "$root.key" -sha256 -days 1024 -out "$root.crt" -config "$cnf.cnf" -subj "/C=$country/ST=$state/L=$city/O=$corp/OU=$unit/CN=$name/emailAddress=$name@$domain" *> $TempFile; Error-Break Write-Host "`nКорневой сертификат создан." -ForegroundColor Green # Имя сертификата $name = $intermediate # Создаёи промежуточный ключ .\openssl genrsa -out "$intermediate.key" *> $TempFile; Error-Break # Создаём запрос на подпись .\openssl req -new -sha256 -config "$cnf.cnf" -key "$intermediate.key" -out "$intermediate.csr" *> $TempFile; Error-Break # Подписываем сертификат корневым .\openssl ca -config "$cnf.cnf" -extensions v3_intermediate_ca -days 2650 -batch -in "$intermediate.csr" -out "$intermediate.crt" -subj "/C=$country/ST=$state/L=$city/O=$corp/OU=$unit/CN=$name/emailAddress=$name@$domain" *> $TempFile; Error-Break # Промежуточный =/= серверный + создание серверного сертификата if ($servint -ne "y"){ Write-Host "Промежуточный сертификат создан." -ForegroundColor Green # Имя сертификата $name = $server # Создаём ключ клиента .\openssl genrsa -out "$server.key" *> $TempFile; Error-Break # Создаём запрос на подпись .\openssl req -new -key "$server.key" -out "$server.csr" -config "$cnf.cnf" *> $TempFile; Error-Break # Подписываем сертификат промежуточным .\openssl x509 -req -in "$server.csr" -CA "$intermediate.crt" -CAkey "$intermediate.key" -CAcreateserial -sha256 -days 2650 -days 2650 -set_serial 01 -out "$server.crt" -extensions v3_req -extfile "$cnf.cnf" -subj "/C=$country/ST=$state/L=$city/O=$corp/OU=$unit/CN=$name/emailAddress=$name@$domain" *> $TempFile; Error-Break } Write-Host "Серверный сертификат создан." -ForegroundColor Green # Создание клиентского сертификата # Имя сертификата $name = $client # Создаём ключ клиента .\openssl genrsa -out "$client.key" *> $TempFile; Error-Break # Создаём запрос на подпись .\openssl req -new -key "$client.key" -out "$client.csr" -config "$cnf.cnf" *> $TempFile; Error-Break # Подписываем сертификат промежуточный (.\openssl x509 -req -in "$client.csr" -CA "$intermediate.crt" -CAkey "$intermediate.key" -CAcreateserial -sha256 -days 2650 -out "$client.crt" -extensions v3_req -extfile "$cnf.cnf" -subj "/C=$country/ST=$state/L=$city/O=$corp/OU=$unit/CN=$name/emailAddress=$name@$domain") *> $TempFile; Error-Break Write-Host "Клиентский сертификат создан." -ForegroundColor Green # Остановка скрипта при ошибке $ErrorActionPreference = "Stop" $thumbprint = $(Get-PfxCertificate -FilePath "$client.crt" | select -expand Thumbprint).ToLower() # Экспортируем промежуточный сертификат и ключ .\openssl pkcs12 -export -in "$server.crt" -inkey "$server.key" -out "$server.p12" -password pass:"$password" # Экспортируем для бравузера .\openssl pkcs12 -export -in "$client.crt" -inkey "$client.key" -out "$client.p12" -password pass:"$password" # Экспортируем всё .\openssl pkcs12 -export -in "$server.crt" -inkey "$server.key" -in "$client.crt" -inkey "$client.key" -in "$root.crt" -inkey "$root.key" -out out.p12 -password pass:"$password" &{ # Создаём директории для сертификатов и линупса New-Item -path "$cpath" -ItemType Directory -force New-Item -path "$lpath" -ItemType Directory -force } >$null Write-Host "`nДиректории созданы успешно." -ForegroundColor Green $ssl_client_fingerprint = '$ssl_client_fingerprint' # Скрипт для линукса $linux = "#!/usr/bin/env bash openssl pkcs12 -in /$dpath/$server.p12 -nokeys -out /opt/iw/tm5/etc/certification/$server.crt -password pass:$password openssl pkcs12 -in /$dpath/$server.p12 -nocerts -nodes -out /opt/iw/tm5/etc/certification/$server.key -password pass:$password rm /$dpath/$server.p12 cd /etc/nginx/conf.d cp iwtm.conf -n iwtm.conf.bak || mv iwtm.conf.bak iwtm.conf sed -i '9s/web-server.pem/$server.crt/' iwtm.conf sed -i '10s/web-server.key/$server.key/' iwtm.conf sed -i '12i ssl_verify_client optional_no_ca;' iwtm.conf sed -i '21i if ( $ssl_client_fingerprint != $thumbprint ) { return 496; }' iwtm.conf " write-output $linux | out-file -append -encoding utf8 "$cnf.sh" # Преобразуем скрипт для линукса в *nix формат ((Get-Content "$cnf.sh") -join "`n") + "`n" | Set-Content -NoNewline "$cnf.sh" # Перемещаем скрипт для линукса и .p12 Move-Item -path ".\$cnf.sh" -destination "$lpath\$cnf.sh" -force Move-Item -path ".\$server.p12" -destination "$lpath\$server.p12" -force # Перемещаем остальное добро Get-ChildItem -Path ".\*.pfx" -Recurse | Move-Item -Destination "$cpath" -force Get-ChildItem -Path ".\*.p12" -Recurse | Move-Item -Destination "$cpath" -force Get-ChildItem -Path ".\*.key" -Recurse | Move-Item -Destination "$cpath" -force Get-ChildItem -Path ".\*.csr" -Recurse | Move-Item -Destination "$cpath" -force Get-ChildItem -Path ".\*.crt" -Recurse | Move-Item -Destination "$cpath" -force # Подчищаем за собой Remove-Item * -Include *.cnf,*.pem,seria*,inde* -Force # Устанавливаем сертификаты в шиндоус &{ Import-Certificate -FilePath "$cpath\$root.crt" -CertStoreLocation Cert:\LocalMachine\Root if ($servint -eq "y"){ Import-Certificate -FilePath "$cpath\$server.crt" -CertStoreLocation Cert:\LocalMachine\CA }else{ Import-Certificate -FilePath "$cpath\$intermediate.crt" -CertStoreLocation Cert:\LocalMachine\CA Import-Certificate -FilePath "$cpath\$server.crt" -CertStoreLocation Cert:\LocalMachine\My } Import-Certificate -FilePath "$cpath\$client.crt" -CertStoreLocation Cert:\LocalMachine\My } >$null Write-Host "Сертификаты установлены." -ForegroundColor Green # Перемещаем скрипт и сертификаты в линупс &{ cd $wpath .\WinSCP.exe sftp://${luser}:${lpassword}@${ip}/$dpath/ /upload $lpath\$server.p12 $lpath\$cnf.sh /defaults Read-Host "`nКогда WinSCP успешно передаст файлы, нажмите [ENTER]" # Запускаем скрипт удалённо echo y | plink -batch $luser@$ip -pw $lpassword "exit" *> $null plink -batch $luser@$ip -pw $lpassword "sudo bash /$dpath/$cnf.sh"; Error-Break # Чистим за собой plink -batch $luser@$ip -pw $lpassword "sudo rm /$dpath/$cnf.sh"; Error-Break plink -batch $luser@$ip -pw $lpassword "history -c"; Error-Break } 2>$null Write-Host "IWTM сконфигурирован." -ForegroundColor Green # Записываем данные в DNS &{Remove-DnsServerResourceRecord -ZoneName $domain -Name $hostname -RRType A -force} 2> $null Add-DnsServerResourceRecordA -Name $hostname -IPv4Address $ip -ZoneName $domain -TimeToLive 01:00:00 Write-Host "DNS запись создана.`n" -ForegroundColor Green Write-Warning "Перезагрузи NGINX и установи в бразуер сертификат.`n"