"sshkeys":"invalid format - invalid urlencoded string

LexyJexon

New Member
Apr 21, 2023
4
1
3
Hello everyone! I'm trying to set template's cloud-init configs via proxmox-api-go package's proxmox.Client.SetVmConfig() method. I need to set username, password, ssh-key and network configs. I created variable map[string]interface{} with content:
{
"ipconfig0": NewNet0Cfg,
"ciuser": username,
"cipassword": password,
"sshkeys": encodedKey,
}

all these keys's values hane type string
I have problem only whith sshkey. First I created variable SshKey := "ssh-rsa AAAAB3...."
Then I tried to urlencode it wirh net/url package :
encodedKey := url.QueryEscape(SshKey)
But when I call SetVmConfig() method I get this responce:
RESULT:
HTTP/1.1 400 Parameter verification failed.
Connection: close
Content-Length: 698
Cache-Control: max-age=0
Content-Type: application/json;charset=UTF-8
Date: Fri, 21 Apr 2023 11:57:08 GMT
Expires: Fri, 21 Apr 2023 11:57:08 GMT
Pragma: no-cache
Server: pve-api-daemon/3.0
{"errors":{"sshkeys":"invalid format - invalid urlencoded string: ssh-rsa+AAAAB3NzaC1yc2EAAAADAQABAAABgQD02Ls76J6njonSYyWAovbUYJnLrNzt%2F6fiXZp1Pbae0egMTb8UgdOrecharIy6EKLmjCGfyZs8Klhg%2BEaDA9O8iTRn%2BHpRUrJhmFdxwaraQ2xEvL6slburbu9vB3vgJxT0oFAHW4osobLPXrZ%2BYZHRZjK9zi%2BW%2FxnLJZFOokWAWKCbYa52%2B7i%2Fk5a605LkZnbO5So3urTurvmdAD7mgBDyngQ2dCUajoAE8RW4aUfkfJoTd9aS6x663%2F19jtR3iyOMsaAxIw4QbRLK3%2FEZBA88cySYglx8xzy4tSXwag1KxXHrWNqiE%2BYSRuhHybfeL22ZXwDmx3zWMLgfZDu3bcOX%2FifVOpCqTMPECT03lIX1HBF%2FSTJQN0IVKPyFFOzLmAfge%2BaP3DopjEL2JHAsA9BSKETO76IeAZNtcKt%2FAFs5KugqMxCLIWQ0Q4uyFp8bJ2f8DOLDV8VvOeHM9aaVOhbXZ%2Fe%2FM%2BmsmV8cl1CWex3kWG7CZLq77FDR1d7qbhfYVH8%3D+kochevoy%40kochevoy-gen2\n"},"data":null}
Can you help me solve this problem please?
 
  • Like
Reactions: iamralf
seems like you have a newline (\n) at the end of your sshkeys string, which seems to be the problem since \ is not valid in an urlencoded string - you should probably remove it completely
 
seems like you have a newline (\n) at the end of your sshkeys string, which seems to be the problem since \ is not valid in an urlencoded string - you should probably remove it completely
Thanks for your reply, I tried to remove \n from the end of string with my ssh key with strings.TrimRight(encodedKey, "\n") But problem still exists.
In request there is no \n:
REQUEST: POST /api2/json/nodes/hw-proxmox-it-2/qemu/109/config
HTTP/1.1 Host: hw-proxmox-it-2.alahd.kz.prod.bash.kz:8006
User-Agent: Go-http-client/1.1
Content-Length: 856
Accept: application/json
Authorization: PVEAuthCookie=PVE:testapi@pve:64461157::kacbwCcbzHnrFrWQ80sGeFWuM67MawiEDBTy4GVDuHs/vH8kii6hP/MmZxg1cf+y9uPhmzTk4ez453Ex1Uvi119XrcQILVLZtrXjFlh3akecV50TxpU3RITtCzD4zLpIcDEKMbc7xj7xGyIFrYC5RYWYmpE/77dl41rT7/qKvGgqhs9DL8ZVyKP1c1VKY6KY6yoq/zMM2uAEyaNlNSSYqzaFgKFQH/7kgyurOyLzJOUQZv+67YP9myPR+dbX7aeKWPiSlM+pdl852GyjFkszSuVEj0R7d+yT1XYyF5FjlveDn202wEDdeXZzfN3Syf5YtQC9oFKKsJsgogBgh8ZUpQ== CSRFPreventionToken: 64461157:pb3Gw/C0zX7kwSVZDdX0vQVAjdvNn9O2N6+hRg3v0RM
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip cipassword=%246%24FhcddHFVZ7ABA4Gi%24l.35ro0JtgQOVq6x9VP7pA2SDYWIAGMWJPCXD1zjIheQn8bnMNjIlrrpfv5ZkhNbbJR2YzBALsDV2kO7Q4jeS1&ciuser=adm-jira&ipconfig0=ip%3D10.7.7.242%2F24%2Cgw%3D10.7.7.254&sshkeys=ssh-rsa%2BAAAAB3NzaC1yc2EAAAADAQABAAABgQD02Ls76J6njonSYyWAovbUYJnLrNzt%252F6fiXZp1Pbae0egMTb8UgdOrecharIy6EKLmjCGfyZs8Klhg%252BEaDA9O8iTRn%252BHpRUrJhmFdxwaraQ2xEvL6slburbu9vB3vgJxT0oFAHW4osobLPXrZ%252BYZHRZjK9zi%252BW%252FxnLJZFOokWAWKCbYa52%252B7i%252Fk5a605LkZnbO5So3urTurvmdAD7mgBDyngQ2dCUajoAE8RW4aUfkfJoTd9aS6x663%252F19jtR3iyOMsaAxIw4QbRLK3%252FEZBA88cySYglx8xzy4tSXwag1KxXHrWNqiE%252BYSRuhHybfeL22ZXwDmx3zWMLgfZDu3bcOX%252FifVOpCqTMPECT03lIX1HBF%252FSTJQN0IVKPyFFOzLmAfge%252BaP3DopjEL2JHAsA9BSKETO76IeAZNtcKt%252FAFs5KugqMxCLIWQ0Q4uyFp8bJ2f8DOLDV8VvOeHM9aaVOhbXZ%252Fe%252FM%252BmsmV8cl1CWex3kWG7CZLq77FDR1d7qbhfYVH8%253D%2Bkochevoy%2540kochevoy-gen2
I think it appears only in response output, and problem in anything alse, I still need help.
 
I too was having this problem when using go's url.QueryEscape() function to encode an ssh key. The problem is that spaces are encoded as "+" so to get around this you can do something like the following:
Code:
strings.Replace(url.QueryEscape(sshKey), "+", "%20", 1)
 
Hello everyone! I'm trying to set template's cloud-init configs via proxmox-api-go package's proxmox.Client.SetVmConfig() method. I need to set username, password, ssh-key and network configs. I created variable map[string]interface{} with content:
{
"ipconfig0": NewNet0Cfg,
"ciuser": username,
"cipassword": password,
"sshkeys": encodedKey,
}

all these keys's values hane type string
I have problem only whith sshkey. First I created variable SshKey := "ssh-rsa AAAAB3...."
Then I tried to urlencode it wirh net/url package :
encodedKey := url.QueryEscape(SshKey)
But when I call SetVmConfig() method I get this responce:
RESULT:
HTTP/1.1 400 Parameter verification failed.
Connection: close
Content-Length: 698
Cache-Control: max-age=0
Content-Type: application/json;charset=UTF-8
Date: Fri, 21 Apr 2023 11:57:08 GMT
Expires: Fri, 21 Apr 2023 11:57:08 GMT
Pragma: no-cache
Server: pve-api-daemon/3.0
{"errors":{"sshkeys":"invalid format - invalid urlencoded string: ssh-rsa+AAAAB3NzaC1yc2EAAAADAQABAAABgQD02Ls76J6njonSYyWAovbUYJnLrNzt%2F6fiXZp1Pbae0egMTb8UgdOrecharIy6EKLmjCGfyZs8Klhg%2BEaDA9O8iTRn%2BHpRUrJhmFdxwaraQ2xEvL6slburbu9vB3vgJxT0oFAHW4osobLPXrZ%2BYZHRZjK9zi%2BW%2FxnLJZFOokWAWKCbYa52%2B7i%2Fk5a605LkZnbO5So3urTurvmdAD7mgBDyngQ2dCUajoAE8RW4aUfkfJoTd9aS6x663%2F19jtR3iyOMsaAxIw4QbRLK3%2FEZBA88cySYglx8xzy4tSXwag1KxXHrWNqiE%2BYSRuhHybfeL22ZXwDmx3zWMLgfZDu3bcOX%2FifVOpCqTMPECT03lIX1HBF%2FSTJQN0IVKPyFFOzLmAfge%2BaP3DopjEL2JHAsA9BSKETO76IeAZNtcKt%2FAFs5KugqMxCLIWQ0Q4uyFp8bJ2f8DOLDV8VvOeHM9aaVOhbXZ%2Fe%2FM%2BmsmV8cl1CWex3kWG7CZLq77FDR1d7qbhfYVH8%3D+kochevoy%40kochevoy-gen2\n"},"data":null}
Can you help me solve this problem please?
I get virtually the same error when sending an sshkey via URI in Ansible. There is no \n or "+" in the variable after {{ | urlencode }}.
But in the error message, as in the error output above, a \n is appended to the string.
How can I fix the error at all? Thanks for any help!

Ansible task:
- name: configure vm
uri:
url: "https://{{ server_url }}:8006/api2/json/nodes/{{ node }}/qemu/{{ vmid_next | trim }}/config"
method: POST
return_content: yes
body_format: json
use_proxy: no
validate_certs: no
timeout: 5
headers:
Authorization: "PVEAPIToken=..."
Content-Type: "application/json"
body:
vmid: "{{ vmid_next | trim }}"
[...]
ciuser: "{{ inventory_settings__pve_vm_username }}"
sshkeys: "{{ inventory_settings__pve_vm_public_key | trim | urlencode }}"
[...]
 
Last edited:
seems like you have a newline (\n) at the end of your sshkeys string, which seems to be the problem since \ is not valid in an urlencoded string - you should probably remove it completely
Stefan, can you check my issue (same with "\n") one line above (Monday) ? Thanks!
 
I know its been a while since you posted this but I wanted to provide some help for those who have been bashing their brain on this issue like myself for way too long.

This worked for me so far. I dont like it and I dont agree with it at all.

vm_sshkeys is a fact that I have that contains my public ssh key in a string format. I run this step before calling the URI and using encoded_sshkeys_output to populate the sshkeys property.

YAML:
- name: Encode SSH Keys for Proxmox
  ansible.builtin.shell: |
    python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=''))" "{{ vm_sshkeys }}"
  register: encoded_sshkeys_output
  changed_when: false

FYI, I created an account on this forum just to respond to this for any future head bashers out there.
 
I know its been a while since you posted this but I wanted to provide some help for those who have been bashing their brain on this issue like myself for way too long.

This worked for me so far. I dont like it and I dont agree with it at all.

vm_sshkeys is a fact that I have that contains my public ssh key in a string format. I run this step before calling the URI and using encoded_sshkeys_output to populate the sshkeys property.

YAML:
- name: Encode SSH Keys for Proxmox
  ansible.builtin.shell: |
    python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=''))" "{{ vm_sshkeys }}"
  register: encoded_sshkeys_output
  changed_when: false

FYI, I created an account on this forum just to respond to this for any future head bashers out there.
Thank you, helped me a lot.

For those who still struggle: You have to reference .stdout from the output.

sshkeys: "{{ encoded_sshkeys_output.stdout }}"
 
I know its been a while since you posted this but I wanted to provide some help for those who have been bashing their brain on this issue like myself for way too long.

This worked for me so far. I dont like it and I dont agree with it at all.

vm_sshkeys is a fact that I have that contains my public ssh key in a string format. I run this step before calling the URI and using encoded_sshkeys_output to populate the sshkeys property.

YAML:
- name: Encode SSH Keys for Proxmox
  ansible.builtin.shell: |
    python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=''))" "{{ vm_sshkeys }}"
  register: encoded_sshkeys_output
  changed_when: false

FYI, I created an account on this forum just to respond to this for any future head bashers out there.
VIP