Powershell: ConvertFrom-SecureString rusak di Linux

Dibuat pada 5 Agu 2016  ·  62Komentar  ·  Sumber: PowerShell/PowerShell

Langkah-langkah untuk mereproduksi

  1. Instal PowerShell di Ubuntu 14.04
  2. Luncurkan PowerShell
  3. Jalankan perintah berikut:
   $password = Convertto-Securestring -String "PowerShellRocks!" -AsPlainText -Force
   ConvertFrom-SecureString $password  

Perilaku yang diharapkan

Tidak ada kesalahan

Perilaku sebenarnya

Kesalahan berikut terjadi

PS /home/chythu/temp> ConvertFrom-SecureString $password                        ConvertFrom-SecureString : Unable to load DLL 'CRYPT32.dll': The specified
module could not be found.
 (Exception from HRESULT: 0x8007007E)
At line:1 char:1
- ConvertFrom-SecureString $password
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  - CategoryInfo          : NotSpecified: (:) [ConvertFrom-SecureString], Dl
    lNotFoundException
  - FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell
    .Commands.ConvertFromSecureStringCommand

Data lingkungan

Name                           Value
---
PSVersion                      5.1.10032.0
PSEdition                      PowerShellCore
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   3.0.0.0
GitCommitId                    v6.0.0-alpha.7
CLRVersion
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

Pembaruan oleh @ travisez13 pada 04-04-2016

Data lingkungan

> $PSVersionTable
Name                           Value                                           
----                           -----                                           
PSVersion                      6.0.2                                           
PSEdition                      Core                                            
GitCommitId                    v6.0.2                                          
OS                             Darwin 17.5.0 Darwin Kernel Version 17.5.0: M...
Platform                       Unix                                            
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                         
PSRemotingProtocolVersion      2.3                                             
SerializationVersion           1.1.0.1                                         
WSManStackVersion              3.0                                             


Solusi

Karya berikut ini
`` Powershell

Anda harus membuat kunci Anda sendiri

$ Kunci = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
$ s | ConvertFrom-SecureString -Key $ Key
``

Area-Cmdlets Issue-Bug OS-Linux OS-macOS Resolution-Fixed

Komentar yang paling membantu

Intinya adalah bahwa kerangka kerja .NET (dan PowerShell) membutuhkan pustaka perlindungan data lintas platform, karena pengembang / ops perlu menyimpan rahasia tidak tiba-tiba hilang ketika kami menambahkan OS baru ke dalam campuran, dan itu tidak selalu praktis untuk mengandalkan layanan web seperti Azure KeyVault, Manajemen Identitas RED, atau Server Rahasia Thycotic. 😕

Tim .NET tampaknya tidak cenderung membantu di sini.

Saya tahu bahwa ASP.NET menulis hal-hal DataProtection mereka sendiri, tetapi itu cukup aneh dan mereka merekomendasikan untuk membatasi penggunaannya untuk skenario tertentu ...

Yang perlu kita ketahui adalah:

Apakah tim PowerShell berencana membuat implementasi lintas platform serialisasi SecureString?

Jika tidak, hapus cmdlet yang tidak berfungsi sama sekali, dan berikan pesan kesalahan yang lebih baik untuk CliXML daripada saat ini, "oh sial, jika hanya ada kesalahan Crypto dll tersedia".

Semua 62 komentar

Berbicara @ KrishnaV-MSFT Ini tidak diperlukan untuk demo Azure. Memindahkannya dari Alpha.10

Menemukan kesalahan yang sama pada MacOS 10.12 Beta (16A270f)

Hanya main-main dapatkan ini:

PS> $User="Jared"
PS> $PWord = ConvertTo-SecureString –String "TestString" –AsPlainText -Force   
PS> $Cred = New-Object -TypeName "System.Management.Automation.PSCredential" –ArgumentList $User, $PWord
PS> ConvertFrom-SecureString -SecureString ($Cred.Password)

Hasil:

ConvertFrom-SecureString : Unable to load DLL 'CRYPT32.dll': The specified module could not be found.
 (Exception from HRESULT: 0x8007007E)
At line:1 char:1
+ ConvertFrom-SecureString -SecureString ($Cred.Password)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-SecureString], DllNotFoundException
    + FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.ConvertFromSecureStringComman

Hai,

kesalahan pustaka yang sama ketika mencoba menggunakan sertifikat yang dipetakan: psdrive:

Get-ChildItem Cert:/LocalMachine/

Kesalahan:

get-childitem: Tidak dapat memuat DLL 'crypt32.dll': Modul yang ditentukan tidak dapat ditemukan.
(Pengecualian dari HRESULT: 0x8007007E)
Pada baris: 1 karakter: 1

  • Sertifikat get-childitem: / LocalMachine /
  • ~ ~ ~ ~ ~ ~ ~ ~ ~

    • CategoryInfo: NotSpecified: (:) [Get-ChildItem], DllNotFoundException

    • FullyQualifiedErrorId: System.DllNotFoundException, Microsoft.PowerShell.Commands.GetChildItemCommand

@ 3535959 temuan bagus! Kesalahannya pasti harus lebih ramah. Di Linux dan macOS Cert:/ penyedia perlu dipikirkan ulang. Cara kedua sistem ini mendekati penyimpanan sertifikat sangat berbeda satu sama lain dan jendela.

Fyi, 16.04.1 dengan PowerShell v6 alpha 14 masih memiliki masalah yang sama

Ini menahan saya dari membawa modul saya ke Linux. Saya ingin dapat menyimpan kunci API Web dengan aman di semua OS, bukan hanya Windows.

Ini adalah sesuatu yang hanya dapat kami aktifkan dengan .NET Standard 2.0 API yang mengembalikan SecureString:

  • Masalah CoreFX: dotnet / corefx # 13062
  • CoreFX 2.0 PR: dotnet / corefx # 13362

ConvertFrom-SecureString dan ConvertTo-SecureString bergantung pada System.Security.Cryptography.ProtectedData , yang masih belum tersedia di netstandard2.0 .
Jadi 2 cmdlet ini perlu dikerjakan ulang di platform Unix.

Saya akan sangat menghargai jika fungsi ini datang ke .Net Core
Kami mengandalkan WinRM dan menggunakan PSCredential untuk mengautentikasi. Menjalankan skrip kami di Linux atau MacOS tidak mungkin saat ini dan itu sedikit menghambat kami.

Kesalahan yang kami lihat:
ConvertTo-SecureString: Tidak dapat memuat DLL 'CRYPT32.dll': Modul yang ditentukan tidak dapat ditemukan.
(Pengecualian dari HRESULT: 0x8007007E)

@ reddwarf666 Paket System.Security.Cryptography.ProtectedData tersedia di nuget.org dan merupakan keluhan netstandard2.0, Namun, tidak ada implementasi untuk platform Unix - ini akan menampilkan 'PlatformNotSupportedException' pada platform Unix. Jadi ConvertFrom/ConvertTo-SecureString perlu ditulis ulang untuk Unix. Kami akan mencoba mendapatkan beberapa panduan dari tim .NET Core tentang cara melakukan tugas yang sama di Unix. / cc @joeyaiello

Apakah [System.Runtime.InteropServices.Marshal] :: SecureStringToBSTR dan [System.Runtime.InteropServices.Marshal] :: PtrToStringAuto kemungkinan besar akan ikut serta?

Masih melihat ini di 6.0.0-beta3 di Mac dan Linux saat menggunakan cmdlet SecureString.

ConvertFrom-SecureString: Tidak dapat memuat DLL 'CRYPT32.dll': Yang ditentukan
modul atau salah satu dependensinya tidak dapat ditemukan.
(Pengecualian dari HRESULT: 0x8007007E)

sama di sini dengan convertfrom-securestring dan convertto-securestring (v6.0.0-beta.3) di linux debian (jessie 64bit):

PS /> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.0.0-beta
PSEdition                      Core
GitCommitId                    v6.0.0-beta.3
OS                             Linux 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2+deb8u2 (2017-06-26)
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

PS />

PS /> read-host -assecurestring | convertfrom-securestring | out-file securestring.txt
********
convertfrom-securestring : Unable to load DLL 'CRYPT32.dll': The specified module or one of its dependencies could not be found.
 (Exception from HRESULT: 0x8007007E)
At line:1 char:29
+ read-host -assecurestring | convertfrom-securestring | out-file secur ...
+                             ~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertFrom-SecureString], DllNotFoundException
    + FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.ConvertFromSecureStringCommand



md5-0a78a142751a1081c46c48e10b6cba93



PS /> $pass = cat securestring.txt | convertto-securestring
convertto-securestring : Unable to load DLL 'CRYPT32.dll': The specified module or one of its dependencies could not be found.
 (Exception from HRESULT: 0x8007007E)
At line:1 char:32
+ $pass = cat securestring.txt | convertto-securestring
+                                ~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [ConvertTo-SecureString], DllNotFoundException
    + FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.ConvertToSecureStringCommand



md5-25ce90db07e4f9f61b58abd5cf739027



PS /> [Reflection.Assembly]::LoadFrom("CRYPT32.dll")
Exception calling "LoadFrom" with "1" argument(s): "Bad IL format."
At line:1 char:1
+ [Reflection.Assembly]::LoadFrom("CRYPT32.dll")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : BadImageFormatException



md5-0a78a142751a1081c46c48e10b6cba93



PS /> Add-Type -Path 'CRYPT32.dll'
Add-Type : Bad IL format.
At line:1 char:1
+ Add-Type -Path 'CRYPT32.dll'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Add-Type], BadImageFormatException
    + FullyQualifiedErrorId : System.BadImageFormatException,Microsoft.PowerShell.Commands.AddTypeCommand

menyalin ke /opt/microsoft/powershell/6.0.0-beta.3/ dan juga ketika ditentukan jalur absolut, memberikan kesalahan yang sama seperti di atas.

apakah ada solusi yang mungkin / diketahui atau apakah kita harus menunggu sampai ini diperbaiki?

@vchrizz Windows dan Unix tidak kompatibel dengan biner dan kami tidak dapat menggunakan Windows dll di Unix. Jadi kita harus menunggu CoreFX.

@iSazonov Saya mengetahui hal ini, bertanya-tanya karena file .dll itu di /opt/microsoft/powershell/6.0.0-beta.3/ tetapi kemudian menemukan:
file linux .dll:
"PE32 executable (DLL) (konsol) Intel 80386 Mono / .Net perakitan, untuk MS Windows"
"PE32 + executable (DLL) (konsol) perakitan Mono / .Net, untuk MS Windows"
file windows CRYPT32.dll:
"PE32 executable (DLL) (GUI) Intel 80386, untuk MS Windows"

sekarang mencari solusi dan menemukan masalah yang sama dengan Export-Clixml:

PS /> $cred=Get-Credential –credential "myuser" | Export-Clixml SecureCredentials.xml

Windows PowerShell credential request
Enter your credentials.
Password for user myuser: **********

Export-Clixml : Unable to load DLL 'CRYPT32.dll': The specified module or one of its dependencies could not be found.
 (Exception from HRESULT: 0x8007007E)
At line:1 char:45
+ ... Credential –credential "myuser" | Export-Clixml SecureCredentials.xml
+                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Export-Clixml], DllNotFoundException
    + FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.ExportClixmlCommand

@vchrizz Saat ini .Net CLI meletakkan semua rakitan dalam paket Unix. # 3961 melacak kemasan Unix.

@ daxian-dbw Kita dapat menggunakan OpenSSH untuk melindungi / membuka proteksi data.

Saya lebih suka kami tidak melakukan hal khusus untuk non-Windows. Sepertinya tim Nuget juga menanyakan hal ini.

@ SteveL-MSFT, dapat mengonfirmasi bahwa tim nuget membutuhkannya (NuGet / Home # 1851), karena saya adalah orang yang membawa mereka sebagai fungsi yang hilang

@ SteveL-MSFT @psmulovics Tampaknya tim CoreFX tidak melacak masalah tertutup sama sekali - Saya yakin kita harus membuka Masalah baru di sana jika kita menginginkan kemajuan.

Berhasil! 😄 Sekarang kami punya jawaban:

Kami tidak punya rencana untuk melakukan ini. Ini membutuhkan fitur OS yang hanya tersedia di Windows.
..
Apa yang kami miliki di .NET Core jelas. Di Windows, ia melakukan apa pun yang dilakukan DPAPI. Di non-Windows ia melakukan apa yang dilakukan DPAPI Windows pada platform tersebut: tidak ada.

Jadi kita harus menyimpulkan:

  1. Gunakan paket System.Security.Cryptography.ProtectedData di Windows dan blokir fitur di formulir rencana lain.
  2. Buat solusi untuk bentuk rencana lainnya. - Jika demikian, saya yakin kita harus membuka Masalah baru untuk dilacak.

Terima kasih telah melihat ini.

@iSazonov akankah opsi 2 juga membawa System.Runtime.InteropServices.Marshal?

@iSazonov Saya kira setidaknya kami memiliki kejelasan tentang mengapa hal itu tidak akan dilakukan alih-alih hanya menutup masalah. Karena ini bukan item pekerjaan kecil, saya pikir kita akan memeriksanya untuk 6.1.0

@ SteveL-MSFT Untuk kompatibilitas mundur dengan Windows PowerShell, saya yakin akan lebih baik menggunakan System.Security.Cryptography.ProtectedData hari ini.

@ngetchell Solusi seperti yang dijelaskan dalam Masalah CoreFX, memerlukan terlalu banyak pekerjaan khusus jadi kami harus menunggu CoreFX. Solusi yang mungkin untuk sistem Unix mungkin - menggunakan koneksi jarak jauh ke sistem windows.

@iSazonov repro berfungsi untuk saya dengan beta.4 di Windows, saya yakin masalahnya hanya di non-Windows saat ini

@ SteveL-MSFT Maaf atas ketidakakuratannya, di bawah System.Security.Cryptography.ProtectedData yang saya maksud adalah _CoreFX package_. Saat ini kami menggunakan implementasi internal. Pertanyaannya adalah - haruskah kita menghapus kode internal dan bermigrasi ke paket? Haruskah kita menghapus cmdlet * -SecureString dari Unix?

@iSazonov Saya yakin kita harus pindah ke paket resmi. Adapun Unix, sepertinya hal yang benar untuk dilakukan adalah menghapusnya. cc @ joeyaello

Hanya ingin mem -
Apakah masih ada rencana untuk _menghapus_ cmdlet ConvertTo / ConvertFrom SecureString?
Bagaimana dengan penanganan Kredensial dan SecureString di Impor / Ekspor CliXml?

Semua ini masih membuang DllNotFoundException yang sangat tidak ramah dari HRESULT ...

Saya memiliki masalah yang sama dengan kesalahan CRYPT32.dll di Linux saat menggunakan cmdlet Export-Clixml. Versi PS 6.0.0

Sama disini. Karena kita membahas tentang portabilitas beberapa skrip, akan sangat menyenangkan mengetahui apakah kita harus mengatasi masalah atau jika sesuatu akan dilakukan pada sisi pwsh atau CoreFX ( yang terakhir sepertinya tidak).

@cenit Mungkin kita akan menggunakan Paket Kompatibilitas Windows

@iSazonov , menurut pemahaman saya, SecureString bergantung pada dukungan OS tertentu yang tidak tersedia di non-Windows dan bukan bagian dari Paket Kompatibilitas Windows.

Kami harus memberikan pesan kesalahan yang lebih baik meskipun ini tidak akan berhasil.

Apakah ada beberapa alternatif yang mungkin untuk cmdlet * -SecureString di Unix jika mereka akan dihapus?
Maaf jika saya melewatkannya, beri saya petunjuk tentang mengapa hal itu tidak mungkin dilakukan di unix. Apa bagian "spesifik-os" yang hilang yang diperlukan di unix?
Bagaimana lagi seseorang bisa menangani kredensial untuk mendapatkannya dalam format yang benar dan selanjutnya menggunakannya?

Saya pikir Masalah di CoreFX ini merangkumnya dengan sempurna: https://github.com/dotnet/corefx/issues/22510
Sayangnya, tampaknya tidak ada kemajuan yang dicapai.

terima kasih, itu menjelaskannya dengan sangat baik.

@ SteveL-MSFT Menggunakan WCP diasumsikan menggunakan pola umum if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { ... }
Jika beberapa API tidak ada di WCP, kami dapat memberikan umpan balik di repo WCP. Tetapi bahkan tanpa itu kita dapat menggunakan pola umum yang digabungkan dengan #if !UNIX .

@iSazonov untuk masalah khusus ini Saya tidak percaya WCP akan menyelesaikan ini karena jenis SecureString benar-benar implementasi kosong di non-Windows.

Aku tetap menyukainya. 😄

Oke, saya mengedit ini untuk memastikan saya mengerti ...

  1. Tidak ada implementasi SecureString kecuali di Windows.
  2. Tim PowerShell mengejeknya, sehingga mereka dapat menghindari mengubah semua API mereka yang memerlukannya.
  3. Kemudian tim .NET menerapkannya tetapi hanya perlindungan dalam memori jangka pendek
  4. Jadi mencoba untuk membuat (dalam) SecureString crash kecuali di Windows, karena seluruh fungsi sekarang hanya Windows, tetapi terbuka di mana-mana ...

Meskipun peringatan dini ini dari 18 bulan lalu

Terlepas dari pesan _extremely clear_ dari tim .Net Framework 6 bulan yang lalu.

🙄

Intinya adalah bahwa kerangka kerja .NET (dan PowerShell) membutuhkan pustaka perlindungan data lintas platform, karena pengembang / ops perlu menyimpan rahasia tidak tiba-tiba hilang ketika kami menambahkan OS baru ke dalam campuran, dan itu tidak selalu praktis untuk mengandalkan layanan web seperti Azure KeyVault, Manajemen Identitas RED, atau Server Rahasia Thycotic. 😕

Tim .NET tampaknya tidak cenderung membantu di sini.

Saya tahu bahwa ASP.NET menulis hal-hal DataProtection mereka sendiri, tetapi itu cukup aneh dan mereka merekomendasikan untuk membatasi penggunaannya untuk skenario tertentu ...

Yang perlu kita ketahui adalah:

Apakah tim PowerShell berencana membuat implementasi lintas platform serialisasi SecureString?

Jika tidak, hapus cmdlet yang tidak berfungsi sama sekali, dan berikan pesan kesalahan yang lebih baik untuk CliXML daripada saat ini, "oh sial, jika hanya ada kesalahan Crypto dll tersedia".

Lihat item terkait:
NuGet / Beranda # 1851
dotnet / corefx # 6746

Kita bisa menggunakan ASP.NET DataProtection. Ini adalah yang paling andal dari apa yang tersedia saat ini. Terutama karena kami membutuhkan cukup banyak.

Saya mencoba membaca kata sandi dengan aman, untuk masuk ke baris perintah MySQL. Apa alternatif yang disarankan, sehingga saya tidak menggemakan kata sandi ke konsol saat saya mengetiknya?

Langkah Repro

$str = Read-Host -AsSecureString
ConvertFrom-SecureString -SecureString $str

Hasil

ConvertFrom-SecureString : Unable to load DLL 'CRYPT32.dll': The specified module or one of its dependencies could not be found.
 (Exception from HRESULT: 0x8007007E)
At line:1 char:1
+ ConvertFrom-SecureString -SecureString $str
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [ConvertFrom-SecureString], DllNotFoundException
+ FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.ConvertFromSecureStringCommand

@ pcgeek86 Ini adalah salah satu solusi untuk mendapatkan string teks biasa dari securestring di linux:

$str = Read-Host -AsSecureString
$plaintext = [System.Net.NetworkCredential]::new('',$str).Password

Saya menambahkan solusi lain dalam deskripsi

Menangani rahasia di Linux tampaknya agak berantakan. Ada banyak upaya implementasi dan proyek yang sudah ketinggalan zaman.

Sepertinya Gnome sedang atau sedang menggunakan Secret Service API . libsecret tampaknya adalah perpustakaan untuk mengakses rahasia menggunakan bus Secret Service.

Mac OS X memungkinkan untuk berinteraksi dengan Keychain melalui utilitas baris perintah security atau secara terprogram melalui Layanan Keychain .

QtKeychain adalah pendekatan untuk membuat kata sandi dan pengelola rahasia platform yang independen untuk Linux (menggunakan libsecret), Mac OS X (menggunakan Gantungan Kunci) dan Windows (menggunakan Windows Credential Store) dan mungkin paling mendekati apa yang diperlukan untuk PowerShell. Bisakah kita menggunakan ini sebagai titik awal?

Sampai ini diperbaiki, berikut kode untuk meneruskan kredensial dengan aman ke pekerjaan latar belakang:


$credentialKey = New-Object 'byte[]' (256/8)
$rng = New-Object 'Security.Cryptography.RNGCryptoServiceProvider'
$rng.GetBytes($credentialKey)

$serializableCredential = [pscustomobject]@{ 
                                                UserName = $credential.UserName;
                                                Password = ConvertFrom-SecureString -SecureString $credential.Password -Key $credentialKey
                                            }

$job = Start-Job {
    param(
        [Parameter(Mandatory)]
        [byte[]]
        $Key
    )
    $serializedCredential = $using:serializableCredential

    $password = ConvertTo-SecureString -String $serializedCredential.Password -Key $Key
    $credential = New-Object 'PSCredential' ($serializedCredential.UserName,$password)
    [Array]::Clear($Key,0,$Key.Length)
} -ArgumentList (,$credentialKey) | Wait-Job | Receive-Job

[Array]::Clear($credentialKey,0,$credentialKey.Length)

Kata Sandi = ConvertFrom-SecureString -SecureString $ credential.Password -Key $ credentialKey

bagaimana ini seharusnya bekerja jika ini memiliki masalah sendiri?

bagaimanapun, coba skrip Anda tetapi mendapat kesalahan:

ConvertFrom-SecureString : Cannot bind argument to parameter 'SecureString' because it is null.
At /home/myusername/powershell.ps1:7 char:99
+ ... = ConvertFrom-SecureString -SecureString $credential.Password -Key $c ...
+                                              ~~~~~~~~~~~~~~~~~~~~

jadi saya mencoba menentukan nama pengguna dan kata sandi dalam variabel tetapi:

ConvertFrom-SecureString : Cannot bind parameter 'SecureString'. Cannot convert the "testpassword" value of type "System.String" to type "System.Security.SecureString".

Mengapa tidak ada masalah terpisah untuk meneruskan string aman melalui psremote? Semua masalah yang terbuka ditutup sebagai duplikat dari ini. Menurut saya masalahnya berbeda.
PSRemote hang selama pertukaran kunci karena kurangnya implementasi CryptoAPI di Linux.
Yang tertarik tergantung di sini https://github.com/PowerShell/PowerShell/blob/5ece96a37fc9bb5cda962b32741b00396ae0f135/src/System.Management.Automation/utils/CryptoUtils.cs#L1117
Btw, kita bisa menambahkan penangan pengecualian yang menunjukkan pesan bahwa securestring belum didukung ^ cukup sulit untuk menyadari itu terkait dengan securestring jika hang seperti itu.
Saya pikir psremoting dapat diperbaiki tanpa memperbaiki ConvertFrom-SecureString commandlet, karena kita tidak perlu menyimpan kunci pada mesin untuk digunakan nanti. Kami hanya perlu membuat pasangan kunci rsa 2048, crypt / decrypt menggunakan rsa, crypt decrypt menggunakan lintas platform AES CBC.

Kabar baik, ada solusi lintas platform.
Solusi untuk PSRemoting
Gunakan implementasi baru python dari PSRP pypsrp yang mendukung securestrings!

@KKomarov Silakan buka edisi baru dengan langkah repo dan saran Anda.

@KKomarov hang telah diperbaiki di PSCore6.2-RC sebagai bagian dari https://github.com/PowerShell/PowerShell/issues/8723 . Kemampuan untuk benar-benar mengirim string aman untuk non-Windows seharusnya menjadi masalah terpisah.

DE0001: SecureString tidak boleh digunakan
https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md#de0001 -securestring-shouldnt-be-used

@tokopedia

DE0001: SecureString tidak boleh digunakan
https://github.com/dotnet/platform-compat/blob/master/docs/DE0001.md#de0001 -securestring-shouldnt-be-used

Meskipun itu bagus di dunia menara gading yang sempurna, di Powershell kami terus-menerus merekatkan berbagai hal dan itu memerlukan autentikasi dalam format apa pun yang diperlukan aplikasi, baik itu API lain, aplikasi lama yang hanya mendukung otentikasi Dasar, dll. Kita tidak bisa begitu saja "gunakan kredensial atau sertifikat windows" untuk semuanya seperti yang dinyatakan oleh rekomendasi ini, itu adalah rekomendasi yang bagus untuk mengembangkan aplikasi baru, tetapi bukan untuk tujuan kami menggunakan PowerShell.

Ini tidak seperti PSCredential pergi kemana-mana yang merupakan implementasi SecureString, jadi sampai kita memiliki sesuatu di inti .net yang dapat menggunakan TPM untuk mengenkripsi kunci atau sesuatu, kita memerlukan opsi "cukup baik".

Sesuatu seperti menggunakan AES256 dan memiliki kunci enkripsi menjadi file dengan izin 600 pada sistem file non-windows adalah permulaan yang mungkin, tidak jauh lebih buruk daripada menggunakan Crypto API di Windows

Saya menambahkan tautan untuk informasi saja.

Intinya:

  1. SecureString tidak dapat dilakukan karena System.Security.Cryptography.ProtectedData hanya untuk Windows. Tidak ada rencana untuk mentransfer API. Tim inti menghentikan API.
  2. Kami dapat menjaga kompatibilitas mundur untuk SecureString di Windows (termasuk remote)
  3. PowerShell Core harus tetap fleksibel dan memungkinkan untuk bekerja dengan aplikasi lama.
  4. Dapat diterima untuk menggunakan otentikasi dasar di lingkungan yang dilindungi
  5. Masalah utama bagaimana mendeteksi lingkungan yang dilindungi vs lingkungan publik dan apa yang harus dilakukan (mencegah otentikasi dasar, hanya memperingatkan, ...).

Sejak awal, komite @ PowerShell / powershell-membahas memperkenalkan SensitiveString untuk menggantikan kebutuhan fungsional SecureString meskipun keduanya tidak aman (tipe SecureString akan tetap dibutuhkan untuk compat mundur). Jenis (apakah "Sensitif" atau "Aman" diperlukan untuk menunjukkan ke PowerShell agar meminta tanpa menggemakan masukan sehingga digunakan lebih dari sekadar untuk remoting. Adapun masalah asli bug ini, ini telah diperbaiki (Anda tidak mendapatkan kesalahan lagi), harap diingat bahwa SecureString secara internal dalam teks biasa.

terima kasih atas pembaruannya, terlihat menjanjikan!
Bolehkah kita meminta perkiraan jangka waktu kapan diharapkan untuk dapat menggunakan ini (misalnya dalam repositori debian microsoft-debian-stretch-prod)?

Adapun masalah asli dari bug ini, ini telah diperbaiki (Anda tidak mendapatkan kesalahan lagi), harap diingat bahwa SecureString secara internal dalam teks biasa.

Apakah ada yang punya link ke perbaikan atau tahu versi rilis apa yang akan tersedia? Saya masih mendapatkan kesalahan crypt32.dll di powershell_6.1.3-1.ubuntu.16.04_amd64.deb (kesepakatan yang sama dengan paket pratinjau 6.2.0-rc.1).

Saya juga ingin tahu bagaimana perbaikan ini memengaruhi Impor / Ekspor-CliXml ketika data yang akan diserialkan berisi objek SecureString atau PSCredential.

@rmbolger Bisakah Anda memeriksa dengan versi terbaru (6.2.0-RC)?

Saya melihat hal yang sama dengan @rmbolger

/home/hillr
03-20 23:44:55 31ms 11> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.2.0-rc.1
PSEdition                      Core
GitCommitId                    6.2.0-rc.1
OS                             Linux 4.4.0-17763-Microsoft #379-Microsoft Wed Mar 06 19:16:00 PST 2019
Platform                       Unix
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

/home/hillr
03-21 00:47:45 35ms 12> ConvertFrom-SecureString -SecureString $ss
ConvertFrom-SecureString : Unable to load shared library 'CRYPT32.dll' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libCRYPT32.dll: cannot open shared object file: No such file or directory
At line:1 char:1
+ ConvertFrom-SecureString -SecureString $ss
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [ConvertFrom-SecureString], DllNotFoundException
+ FullyQualifiedErrorId : System.DllNotFoundException,Microsoft.PowerShell.Commands.ConvertFromSecureStringCommand
Apakah halaman ini membantu?
5 / 5 - 1 peringkat