如何在golang ssh

时间:2017-02-08 05:32:44

标签: go ssh x509

我很感激指针,因为我无法解决如何解密加密密钥以便将其与golang ssh一起使用。我试图将两个其他代码源(包括this一个)混合在一起但无法使其工作。

我想我要去一个DER,但需要将它编组回PEM,以便与crypto / ssh一起使用

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D7C72273BE168626E5B2D1BC72E56326
...
-----END RSA PRIVATE KEY-----

我读了它:

key, err := ioutil.ReadFile(privateKey)
if err != nil {
    log.Fatalf("Unable to read private key: %v", err)
}

使用未加密的(!)键,我可以:

signer, err := ssh.ParsePrivateKey(key)
if err != nil {
    log.Fatalf("Unable to parse private key: %v", err)
}

config := &ssh.ClientConfig{
    User: username,
    Auth: []ssh.AuthMethod{
        ssh.PublicKeys(signer),
    },
}

这样可行。

我重用了一些我认为解密的PEM作为DER的代码:

func decrypt(key []byte, password []byte) []byte {
    block, rest := pem.Decode(key)
    if len(rest) > 0 {
        log.Fatalf("Extra data included in key")
    }
    der, err := x509.DecryptPEMBlock(block, password)
    if err != nil {
        log.Fatalf("Decrypt failed: %v", err)
    }
    return der
}

但是,我如何从DER到签名者?

或者,解决这个问题的最佳方式是什么?

3 个答案:

答案 0 :(得分:7)

如果你有带RSA私钥的DER块,你可以使用x509.ParsePKCS1PrivateKey来解析密钥,使用ssh.NewSignerFromKey来获取ssh.Signer

key, err := x509.ParsePKCS1PrivateKey(der)
if err != nil {
    log.Fatal(err)
}
signer := ssh.NewSignerFromKey(key)

答案 1 :(得分:6)

我将在这里提供一个替代方案,允许重用ssh.ParsePrivateKey(key)。我修改了decrypt函数来解密和编码私钥(如果它是加密的)并返回它,以便返回的key可以直接在ssh.ParsePrivateKey(key)中使用。它利用pem.EncodeToMemory从解密的PEM块中获取密钥。

func decrypt(key []byte, password []byte) []byte {
    block, rest := pem.Decode(key)
    if len(rest) > 0 {
        log.Fatalf("Extra data included in key")
    }

    if x509.IsEncryptedPEMBlock(block) {
        der, err := x509.DecryptPEMBlock(block, password)
        if err != nil {
            log.Fatalf("Decrypt failed: %v", err)
        }
        return pem.EncodeToMemory(&pem.Block{Type: block.Type, Bytes: der})
    }
    return key
}

答案 2 :(得分:5)

import QtQuick 2.7 
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0
import QtQuick.Window 2.2

ApplicationWindow {
  visible: true
  width: 640
  height: 480
  title: qsTr("Hello World")

  Rectangle {
    id: rectangle
    x: 180
    y: 99
    width: 200
    height: 200
    color: "#b73131"

    Text {
      id: text1
      x: -112
      y: 85
      text: qsTr("Text")
      //rotation: -90
      anchors.right: parent.left
      anchors.rightMargin: 20
      font.pixelSize: 12
      transform: Rotation { origin.x: text1.width; origin.y: 0; angle: -90}
    }

    Text {
        id: text2
        x: -46
        y: 160
        text: qsTr("Textg")
        font.pixelSize: 12
        //rotation: -90
        anchors.right: parent.left
        anchors.rightMargin: 20
        transform: Rotation { origin.x: text2.width; origin.y: 0; angle: -90}
    }
  }
}

使用未加密的密钥:

import "golang.org/x/crypto/ssh"

使用加密密钥:

signer, err := ssh.ParsePrivateKey(key)

然后:

signer, err := ssh.ParsePrivateKeyWithPassphrase(key, []byte("password"))