我有一个Web表单,该表单允许用户发布私钥,主机名,用户名,并允许我使用私钥通过SSH通过“主机名”建立连接并运行测试命令。

我正在为此测试使用golang和ssh软件包。

是的,我知道在表单上发送私钥的危险,但这对我来说是一个内部项目,并不是真正可以公开使用的东西。

所以,继续,这就是我的代码的样子

func setupSSHConfigWithKey(user string, pkey string) *ssh.ClientConfig {

pkey_bytes := []byte(pkey)

// parse the key
signer, err := ssh.ParsePrivateKey(pkey_bytes)

    if err != nil {
        panic(err)
    }

当这段代码运行时,将导致以下错误

2019/11/15 23:57:14 http:紧急服务[:: 1]:62783:asn1:语法错误:数据被截断

奇怪的是,如果我使用io/ioutil读取自己的“id_rsa.pub”,则不会发生该错误。但是,只有当我粘贴“id_rsa.pub”文件的内容时,才会发生此错误。

我不知道为什么会发生这种情况,我不确定如何解决。

我检查了id_rsa.pub文件内容的字节数组输出以及表单值,它们均相同且长度相同。

我怀疑错误来自https://golang.org/src/encoding/asn1/asn1.go

因此,我正在尝试更深入地研究如何解决此问题,但到目前为止还没有提出太多建议。

请在这里查看如何解决此错误。

编辑:

今天早上,我一直在研究更多内容,发现了一些更有趣的结果

如果我运行以下代码,则不会出错。但是,如果我将下面的私钥字符串发布到Web表单中,然后使用下面的相同代码但具有http请求FormValue而不是仅声明一个 byte slice ,则将得到上面指出的asn1错误。下面的示例是一个测试密钥。
package main

import (
    "log"
    "encoding/pem"
    "crypto/x509"
)

func main() {

    pkey_bytes := []byte(`-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAv+B+qNevh/iaPmWAnulN5flRatGo6V97CjbJ7P2tp0YuiI+O
zCXcoY7Mmv4sDbZicBrtbIvi3l3hKqhbV+1ArhwPmoEem3M9yM1goZqoE6mh5Wst
zlVOAx1HjfFNYteV3TPpIb8S+5q5vEXguYv/oBmCv44Jjf4wuvGHjbX6vJg8VT4q
sG5uF74h59+nOOAsox2BQ7wK24ccfZBIl+O/L5juSJWnVJYOoaddJ9fiEB2JqKYQ
443ZOqwml6Vu0ZeSX3AuqtiSQiDSI+AAX62YtBeza4CzUnYTQIA2HV5/wfp2tFk3
sP9FjOPENqr6jQjcdPjtgNK+Sd00UI823Q288wIDAQABAoIBAFuiGJsFtjxXS0I1
M0Gw5ZTIhktfKS2afaYZGEHnvEDAUYTCGk4AXueAzNHQRLWfvk8PbQeDnqrXZqr6
j/TjxxnfKMx+kWFnncAB5P4IX/BT+I8Zqlx5fLIcD4oIDQ8BKf7jxZhqKeSitcTm
EjZKV5/bzwcwC/wVwqvkoPnaSI47ycCmXUj88ccZGfItOzoFYEbQ2yI1cMJ2sfBU
8PkvPzm0IB63L6BixdC2b+2jyoOCadF6VTRRh53BNH6WcyTBFy2CC6VwXajWh5KD
z5HUTcsUfb+nsZjQdmJjmObdQxvjqpjwlnW9XmNaF9EMjwioiljrgzH0nYSiJOk3
4cfvTLECgYEA6kW8HKipGN/R2lXy3QtQxyrNxg1IhbVhGbQGtIy5HTLyj+7UgyQW
xhT0miRHAbEqjFMqd8dpruKFq+PxVzDiJpExac7LzwCfNgywqlg6lzowD5tB9QYm
Bgw7y8EySMHruMd0LgDXTeXNV2eScbzuwQY6h2wDeA6X99Q4zVakWoUCgYEA0awt
DfyQKQhkrB4YMdmquseouVbN7XyX3YeanRKbpyHWwnGUIqOLv0lYxDDubnxz9+uG
cD15gps3CE5aQGaNDEgCuPRb6hDN66bN83QW7Lz5USrP95lczTvoMKA1OpLKUzpT
8IaGMYZEjCjamVut6u7Vub6yt09pNpGpvHMdnxcCgYEAwR4LG3TNL/wQ+XKwaRbS
19upFQIOLmp+SLnmbR8z2aYN3ih6dkBhpZfQquAMyJBLCrHj6CkyLT/+ANw+LinV
wwUdPqOBznosxFlhqIpighctVzAdBuayoXmkMSppUSDKN9/zHZkD4ur0goCWb7vW
9Lc1uDyJ/4XIMDt5N4ucoCECgYEAlr9yuT6gK1BEiVct0BGOZbINRgv6DMhqq7TG
Xi41yQlUTgK5Hdp2LDbA4nXHx5olCtfElcgtJ9EO1SL4Upsox+6yPmY5+2TPmKEa
K/KIVPddTZU5ZuxVw51RyDw3aQCHBSXHmgQuUUcW26q32FEJDwNemKhZ99/ZZol9
/ubJIksCgYA9OyXSqXcylevH51xujT99/21pfOjurYqKYWTpcrmq5vuatD++aQim
6ENMubkz3mNvma8nByzjPwfFBDIZcBPo2f412bvXbrlUPGs6sWIXQVAbCDesf1Lp
xUTpA9+55L6UtElwdcKyfwwGlXNkwwOUhF0T7XJuCn1s0CSVJD7YsA==
-----END RSA PRIVATE KEY-----`)

    log.Println(pkey_bytes)

    block, _ := pem.Decode(pkey_bytes)
    log.Println("Block: " + block.Type)
    log.Println(block.Headers)
    log.Println(block.Bytes)
    _, err := x509.ParsePKCS1PrivateKey(block.Bytes)

    if err != nil {
        log.Println(err)
    }
}

输出

2019/11/16 11:04:11区块:RSA PRIVATE KEY
2019/11/16 11:04:11 map []
2019/11/16 11:04:11 [48130 4 164 2 1 0 2 130 1 1 0 213 0 152 15 73
240 7 87 162 114 194 234 45 84 130 9 85 7 95 176 198 251 169 58 203
163 2 192 75 109 200 120 10 195 37 24 189 125 27 54 78 217 229 189 64
207138199 4925518012575 93 0220132212152214214 37 43 19181
144 89 80 37 163 12 242 194 170 155 234 172 185 211 32 108 249 155 26
234 168 83 177 1 186 48 191 174 238 204 193 75 215 5 123 138 177 67 43
126 102 153 69 24 25 240 148 141 236 52 29 160 204 122 172 71 71 66 43
8167 19 218 153 141 113 31 226 169 118 180 180 18 172 244 178 151 211 253
82 203 3 46 145 77 142 223 2 46 248 251 164 251 24 120 12 35 127 82 13
250 162 162 55 143 120 88 51 102 11 170 180 181 89 224 69 148 93253
245 31 146 111 77 211 202 63 159 52 255 29 248 148 41 237 159 120 25
40 204 241 39 154 123 146 79 77 196 221 167 16 42 24 224 244 229 191 7
56 34 158 240 173 159 118 135 93 205 190 52 100 11 94 6 76 73 35 166
197 123 35 112 120 152 220 174 217 122 10 94 51 210 157 2 3 1 0 1 2
130 1 0 63 218 3 187 97 144 192 194 182 129 236 136 66 186 120 152 207
146 124 79 3 247 97 13 173 9 218 195 70 89 76 165 31 164 204 52 20 105
178 132 159 50 150 186 26 249 156 66 134 108 126 240 168 108 226 219
56 62 122 234 135 13216 196 174 214 247 61 177 25 42 148 204 140 28
215 86 133 65 205 41 46 35 237 128 52 70 117 156 25 12 253 37 188 223
157 26 130 28 60 193 82 191 113 14 212 151 111 216 38 212 129 142 243
56 134 129 133 172 171 89 99 46 127 83 134 146 26 181 142 57 186 249
145 17 157 39 253 37 185 230 25 132 162 59 175 136 187 215 251 176 75
70 231 253 19 86 147 106 158 52 100 193 231 203 249 119 254 33 194 240
113 92 131 187 65 89 90 63 126 83 225 56 177 211 137 74 155 220 177
104 203 106 141 183 150 24 159 123 222 229 107 222 168 41 55 0 84 192
173 69 177 227 134 196 27 39 90 28 88 138 124 159 56 254 111 59 114
160 217 10 253 207 183 225 66 217 13 47 186 90 254 82 21 59 221 171
240 13 106 34 134 168 235 62 1 2 129 129 0 249 28 59 180 159 49 111
179 128 82 9 178 195 199 223 240 146 255 255 34 136 248 187 226 183 14 35
50 248 236 235 102 135 196 80 182 27 16 247 199 134 134 108 140 13 31 158
127210 45 172 18 28 252 82 60 230 221 100 136 5 31 164 246 0 178 127
592112452195019113417810310311310923823810644249249155140
184 166 158 74 58 176 8 155 3 108 105 124 106 66 251 146 173 197 195
250 183 168 87 244 200 19 64 10 184 94 172 72 74 100 187 79 201 188 22
82 96 132 63 175 221 2 129 129 0 218 228 180 240 239 129 76 1 58 133
168 65 115 237 70 128 13 179 229 144 56 82 154 92 97 137 196 61 152 41
186 145 8 61 5 11 23 201 102 28 119 6 147 133 36 186 157 169 120 245
81 81 249 172 104 93 98 96 86 54 231 122 205 178 44 147 165 6 87 105
242 179 191 230 166 112 57 244 148 153 204 219 173 143 194 71 182 77
29 112 82 132 68 8 183 178 169 200 138 216 46 65 49 37 214 96 198 78
184 71 120 145 89 7 138 134 23 236 157 132 36 17 93 153 152 171 225
193 2 129 129 0 142 141 32 129 128 227 170 87 30 228 83 86 112 0 173
222 158 79 207 244 111 218 28 167 194 56 84 79 236 75 220 245 110 90
253138201143143241180180113 4133134143 0184 80 18 97113230
161 161 63 41 235 72 123 78 75 212 36 80 248 236 151 113 99 62 4 151
140232117 15 12 197 69 211 143 179 220 106 196 132 23 199 106 117 66
101 68 140 4 198 229 237 142 241 111 239 198 47 88 125 228 12 88 6 138
112 234 199 199 130 147 73 218 88 126 177 143 55 190 182 182 37 2 129 128
21 17 150 104 234 100 163 144 42 181 218 176 18 28 112 128 186 208 233
243 171 184 39 171 100 168 1 255 123 185 232 127 53 47 202 96 122 245
163 162 113 194 108 72 144 116 117 224 110 8 14 191 185 44 99 15 57
252211207 141 16 64 228 57 110 44 160 35161202254 138 38 5 55 32
28 238 128 175 59 37 197 132 137 170 126 89 171 10 6 57 22 45 184 64
167 80 213 229 253 216 97 47 245 56 161 51 19 142 3 79 114 110 94225
198 160 146 171 118 16 112 76 69 159 1 2 129 129 0 146 125 104 230 161
38 131 49 43 63 55 120 162 242 9 135 203 88 233 46 53 10 163 157 198
66 1 219 141 142 207 126 139 42 195 107 199 104 186 220 78 164 72 177
193 221 223 241 16 35 22 28 181 75 118 169 34 85 169 230 97 123 206 82
193 118 211 182 243 255 68 187 181 251 91 49 173 252 90238 197 197
128 105 43 172 25 253 136 160 24 125 161 54 134 125 180 69 87 64 3 87
123 16 219 67 6 225 146 87 18 185 182 66 87 60 43 77 185 109 44 123 29
202 80 97 210 159]

最佳答案

奇怪的是,如果我使用io / ioutil读取自己的“id_rsa.pub”,则不会发生该错误。但是,只有当我粘贴“id_rsa.pub”文件的内容时,才会发生此错误。

我也很奇怪,为什么还要在ssh.ParsePrivateKey中输入“id_rsa.pub”( public 密钥)?

在测试中,我输入了“id_rsa”(私钥),并且没有发生错误。

    pkbytes, err := ioutil.ReadFile("id_rsa")
    if err != nil {
        log.Println(err)
        return
    }

    s, err := ssh.ParsePrivateKey(pkbytes)
    if err != nil {
        log.Println(err)
        return
    }

    log.Println(s.PublicKey())

因此,我想如果您对rsa(这是一种非对称密码学)了解甚多,则意味着您无法将 public 密钥转换为 private 密钥(除非您知道设置)。

或者,也许您需要让我们重现该错误,或​​者说明如何粘贴私钥。

10-02 23:03