通过表单发送 ssh 私钥会导致"asn1:语法错误:数据被截断"



我有一个webform,它允许用户发布私钥、主机名和用户名,并允许我使用私钥通过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://panic serving[::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,而不是仅仅声明一个字节片,我会得到上面指出的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 KEY2019/11/16 11:04:11地图[]2019/11/16 11:04:11[48 130 4 164 2 1 0 2 130 1 1 0 213 0 152 15 73240 7 87 162 114 194 234 45 84 130 9 85 7 95 176 198 251 169 58 203163 2 192 75 109 200 120 10 195 37 24 189 125 27 54 78 217 229 189 64207 138 199 49 255 180 125 75 93 0 220 132 152 214 37 43 19 181144 89 80 37 163 12 242 194 170 234 172 185 211 32 108 249 155 26234 168 83 177 1 186 48 191 174 238 204 193 75 215 5 123 138 177 67 43126 102 153 69 24 25 240 148 141 236 52 29 160 204 122 71 71 66 438 167 19 218 153 141 113 31 226 169 118 18 172 244 178 151 211 25382 203 3 46 145 77 142 223 2 46 248 251 164 251 24 120 12 35 127 82 13250 162 55 143 120 88 51 102 11 170 180 181 89 224 69 148 93 253245 31 146 111 77 211 202 63 159 52 255 29 248 148 41 237 159 120 2540 204 241 39 154 123 146 79 196 221 167 16 42 24 224 244 229 191 756 34 158 240 173 159 118 135 93 205 190 52 100 11 94 6 73 35 166197 123 35 112 120 152 220 174 217 122 10 94 51 210 157 2 3 1 0 1 2130 1 0 63 218 3 187 97 144 192 182 129 236 136 66 186 120 152 207146 124 79 3 247 97 13 173 9 218 195 70 89 76 165 31 164 204 52 20 105178 132 159 50 150 186 26 249 156 66 134 108 126 240 168 108 226 21956 62 122 234 135 13 216 196 174 214 247 61 177 25 42 148 204 140 28215 86 133 65 205 41 46 35 237 128 52 70 117 156 25 12 253 37 188 223157 26 130 28 60 193 82 191 113 14 212 151 111 216 38 212 129 142 24356 134 129 133 172 171 89 99 46 127 83 134 146 26 181 142 57 186 249145 17 157 39 253 37 185 230 25 132 59 175 136 187 215 251 176 7570 231 253 19 86 147 106 158 52 100 193 231 203 249 119 254 33 194 240113 92 131 187 65 89 90 63 126 83 225 56 177 211 137 74 155 220 177104 203 106 141 183 150 24 159 123 222 229 107 222 168 41 55 0 84 192173 69 177 227 134 196 27 39 90 28 88 138 124 159 56 254 111 59 114160 217 10 253 207 183 225 66 217 13 47 186 90 254 82 21 59 221 171240 13 106 34 168 235 62 1 2 129 0 249 28 59 180 159 49 111179 128 82 9 178 195 199 223 240 146 255 34 136 248 187 226 183 14 3550 248 236 235 102 135 196 80 182 27 247 199 134 108 140 13 31 158127 210 45 172 18 28 252 82 60 230 221 100 136 5 31 164 246 0 178 12759 211 245 219 50 191 134 178 103 109 238 106 44 249 124 155 140184 166 158 74 58 176 8 155 3 108 105 124 106 66 251 146 173 197 195250 183 168 87 244 200 19 64 10 184 94 172 72 74 100 187 79 201 188 2282 96 132 63 175 221 2 129 0 218 228 180 240 239 129 76 1 58 133168 65 115 237 70 128 13 179 229 144 56 154 92 97 137 196 61 152 41186 145 8 61 5 11 23 201 102 28 119 6 147 133 36 186 157 169 120 24581 81 249 172 104 93 98 96 86 54 231 122 205 178 44 147 165 6 87 105242 179 191 230 166 112 57 244 148 153 204 219 173 143 194 71 182 7729 112 82 132 68 8 183 178 169 200 138 216 46 65 49 37 214 96 198 78184 71 120 145 89 7 138 134 23 236 157 132 36 17 93 153 152 171 225193 2 129 129 0 142 141 32 129 128 227 170 30 228 83 86 112 0 173222 158 79 207 244 111 218 28 167 194 56 79 236 75 220 245 110 90253 138 201 143 241 38 180 113 4 133 143 0 184 80 18 97 113 230161 161 63 41 235 72 123 78 75 212 36 80 248 236 151 113 99 62 4 151140 232 117 15 12 197 69 211 143 179 220 106 196 132 23 199 106 117 66101 68 140 4 198 229 237 142 241 111 239 198 47 88 125 228 12 88 6 138112 234 199 199 130 147 73 218 88 126 177 143 55 190 182 37 2 129 12821 17 150 104 234 100 163 144 42 181 218 176 18 28 112 128 186 208 233243 171 184 39 171 100 168 1 255 123 185 232 127 53 47 202 96 122 245163 162 113 194 108 72 144 116 117 224 110 8 14 191 185 44 99 15 57252 211 207 141 16 64 228 57 110 44 160 35 161 202 254 138 38 5 55 3228 238 128 175 59 37 197 132 137 170 126 89 171 10 6 57 22 45 184 64167 80 213 229 253 216 97 47 245 56 161 51 142 3 79 114 110 94 225198 160 146 171 118 16 112 76 69 159 1 2 129 0 146 125 104 230 16138 131 49 43 63 55 120 162 242 9 135 203 88 233 46 53 10 163 157 19866 1 219 141 142 207 126 139 42 195 107 199 104 186 220 78 164 72 177193 221 223 241 16 35 22 28 181 75 118 169 34 85 169 230 97 123 206 82193 118 211 182 243 255 68 187 181 251 91 173 252 90 238 197 197128 105 43 172 25 253 136 160 24 125 161 54 134 125 180 69 87 64 3 87123 16 219 67 6 225 146 87 18 185 182 66 87 60 43 77 185 109 44 123 29202 80 97 210 159]

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

我也很奇怪,为什么要在ssh.ParsePrivateKey中输入"id_rsa.pub"(公钥)?

在我的测试中,我输入了"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有很多了解,这是一种非对称密码学,这意味着你不能将公钥转换为私钥(除非你知道设置)。

或者你可能需要让我们重现错误,或者展示你是如何粘贴私钥的。

尝试对已发布的数据进行编码,因为键的后缀可能包含'='字符。

最新更新