Prolem med att läsa DSA-nyckel i .net core

Permalänk
Medlem

Prolem med att läsa DSA-nyckel i .net core

Det är så att jag försöker DSA-signera lite data mha en existerande privat nyckel. Nyckeln är skapad genom köra kommandot

openssl dsaparam -out dsaparam.pem 2048 && openssl gendsa -out dsaprivkey.pem dsaparam.pem

Detta ger en nyckel som ser ut som man kan förvänta sig

-----BEGIN DSA PRIVATE KEY----- MIIDVQIBAAKC.... -----END DSA PRIVATE KEY-----

Sen försöker jag använda den såhär:

var privateKey = File.ReadAllText("dsaprivkey.pem").Replace(" DSA", string.Empty); var d = DSA.Create(); d.ImportFromPem(privateKey);

Notera att jag plockar bort " DSA" ur nyckel. Det är för att enligt dokumentationen så stödjs endast begin/end key labels (docs). Lite märkligt men det gjorde så att jag kom vidare till nästa exception där jag nu är fast. Det har medelandet

"ANS1 corrupted data"

och det innre meddelandet är

"The provided data is tagged with 'Universal' class value '2', but it should have been 'Universal' class value '16'."

Är det nån som har någon aning om vad det kan va för fel jag gör?

Visa signatur

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy of that airplane glue

Permalänk
Medlem
Skrivet av DarkBob:

Det är så att jag försöker DSA-signera lite data mha en existerande privat nyckel. Nyckeln är skapad genom köra kommandot

openssl dsaparam -out dsaparam.pem 2048 && openssl gendsa -out dsaprivkey.pem dsaparam.pem

Detta ger en nyckel som ser ut som man kan förvänta sig

-----BEGIN DSA PRIVATE KEY----- MIIDVQIBAAKC.... -----END DSA PRIVATE KEY-----

Sen försöker jag använda den såhär:

var privateKey = File.ReadAllText("dsaprivkey.pem").Replace(" DSA", string.Empty); var d = DSA.Create(); d.ImportFromPem(privateKey);

Notera att jag plockar bort " DSA" ur nyckel. Det är för att enligt dokumentationen så stödjs endast begin/end key labels (docs). Lite märkligt men det gjorde så att jag kom vidare till nästa exception där jag nu är fast. Det har medelandet

"ANS1 corrupted data"

och det innre meddelandet är

"The provided data is tagged with 'Universal' class value '2', but it should have been 'Universal' class value '16'."

Är det nån som har någon aning om vad det kan va för fel jag gör?

inte .NET-utvecklare men: skulle det kunna vara ett problem med encoding på filen?

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem
Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem

Testade att läsa filen med både ASCII och UTF8 utan skillnad. Dokumentationen och exceptions om man ger skräpdata får mig att tro att den bara vill ha det råa innehållet från filen.

Visa signatur

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy of that airplane glue

Permalänk

En fil med PEM-struktur innehåller en eller flera sektioner med ASN.1-kodad data. Varje struktur innesluts mellan sin start- (
-----BEGIN <etikett>-----) och slutetikett (-----END <etikett>-----) där etiketten sätts utifrån innehållet i det ASN.1-kodade datat (MIIDVQIBAAKC...).

Att endast byta etiketten ändrar inte innehållet i det ASN.1-kodade datat.

Etiketten "DSA PRIVATE KEY" indikerar en DSA-nyckel sparad i formatet PCKS#1. Dokumentationen du hänvisar till kräver en nyckel sparad i formatet PKCS#8. OpenSSL kan generera en nyckel i det formatet med kommandot openssl pkcs8 <argument>. Jag minns tyvärr ej exakt hur man gör men det är googlingsbart!

Permalänk
Medlem

genomelak har redan gett dig rätt svar. Men jag måste fråga, varför DSA? DSA bör inte användas längre. Kör ECDSA eller ed25519 istället.

Permalänk
Medlem
Skrivet av dlq84:

genomelak har redan gett dig rätt svar. Men jag måste fråga, varför DSA? DSA bör inte användas längre. Kör ECDSA eller ed25519 istället.

Legacy reasons. Har licensenycklar som är genererade med DSA och de måste fortsätta fungera, även när vi uppar systemen.

Visa signatur

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy of that airplane glue

Permalänk
Medlem
Skrivet av genomelak:

En fil med PEM-struktur innehåller en eller flera sektioner med ASN.1-kodad data. Varje struktur innesluts mellan sin start- (
-----BEGIN <etikett>-----) och slutetikett (-----END <etikett>-----) där etiketten sätts utifrån innehållet i det ASN.1-kodade datat (MIIDVQIBAAKC...).

Att endast byta etiketten ändrar inte innehållet i det ASN.1-kodade datat.

Etiketten "DSA PRIVATE KEY" indikerar en DSA-nyckel sparad i formatet PCKS#1. Dokumentationen du hänvisar till kräver en nyckel sparad i formatet PKCS#8. OpenSSL kan generera en nyckel i det formatet med kommandot openssl pkcs8 <argument>. Jag minns tyvärr ej exakt hur man gör men det är googlingsbart!

Det här är intressant. Kör jag min genererade nyckel genom nåt verktyg jag hittade på google så säger den att formatet är PCKS#8. DSA objektet har en metod som heter ImportPcks8PrivateKey men som vill ha en array av bytes. Enligt internet så ska man då ta det som är mellan labels och köra Convert.FromBase64 på men det ger samma resultat. Får känslan av att jag har format-stök.

Visa signatur

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy of that airplane glue

Permalänk
Skrivet av DarkBob:

Det här är intressant. Kör jag min genererade nyckel genom nåt verktyg jag hittade på google så säger den att formatet är PCKS#8. DSA objektet har en metod som heter ImportPcks8PrivateKey men som vill ha en array av bytes. Enligt internet så ska man då ta det som är mellan labels och köra Convert.FromBase64 på men det ger samma resultat. Får känslan av att jag har format-stök.

Datat mellan etiketterna är mycket riktigt base64-kodad ASN.1, dock med radbrytningar för att inte bryta mot PEM-specifikationen.

Det är möjligt att fel etikett har satts av något verktyg vid något skede för just din nyckel. Om filen faktiskt innehåller en nyckel i PKCS#8-format bör du kunna göra precis som du föreslår och ge resulterande bytes till det verktyg du använder.

Permalänk
Medlem

Fick lite hjälp på reddit. Tydligen så skulle jag göra om nyckeln mha openssl på följande sätt:

openssl pkcs8 -topk8 -inform PEM -outform PEM -in dsaprivkey.pem -out dsaprivkey.pkcs8.pem -nocrypt

Sen fick jag det inte att funka med dotnets inbyggda DSA signering (antagligen pga handhavandefel) men när jag kör med bouncy castle så gick det utmärkt. Mången tack för hjälpen!

Visa signatur

"Say unto thine own heart, I am mine own redeemer"
Don't touch me when I'm crazy of that airplane glue