This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Uploading SSL Certificate Using API

I have been trying to upload a Let's Encrypt certificate to our XG firewalls, this would allow for the automated renewal of the certificates and replacement at WAF rule on the firewall. Unfortunately I am getting stuck on the upload part with the following error:  "<Status code="500">Operation could not be performed on Entity.</Status>".

I have followed this post (I did ask this question at the end of that post, but thought I should create a new question): https://community.sophos.com/products/xg-firewall/f/sophos-xg-firewall-general-discussion/102208/upload-certificate-using-api

This is the PowerShell script that I have got so far (based a lot off this page: http://blog.majcica.com/2016/01/13/powershell-tips-and-tricks-multipartform-data-requests/)


$ContentType = "application/octet-stream"
$certFile = "C:\temp\LE_cert.pfx"
$fileName = Split-Path $certFile -leaf
$boundary = [guid]::NewGuid().ToString()
$fileBin = [System.IO.File]::ReadAllBytes($certFile)

$enc = [System.Text.Encoding]::GetEncoding("iso-8859-1")

$template = @'
   --{0}
   Content-Type: application/xml; charset=utf-8
   Content-Disposition: form-data; name=reqxml
   <Request>
      <Login>
         <Username>apiUSER</Username>
         <Password>apiPWD</Password>
      </Login>
      <Set operation="add">
         <Certificate>
            <Name>LE_tcxapi_20181105_cert</Name>
            <Action>UploadCertificate</Action>
            <CertificateFormat>pkcs12</CertificateFormat>
            <Password>pwd</Password>
            <CertificateFile>{1}</CertificateFile>
         </Certificate>
      </Set>
   </Request>
   --{0}
   Content-Disposition: form-data; filename="{1}"; name="Unique"
   Content-Type: {2}
   {3}
   --{0}--
'@

$body = $template -f $boundary, $fileName, $ContentType, $enc.GetString($fileBin)
 

$response = Invoke-WebRequest -UseBasicParsing -Headers $headers -Uri 'fw-exg-00:4444/.../APIControlleroperation="add"><Certificate><Name>MHA_TEST_Cert</Name><Action>UploadCertificate</Action><CertificateFormat>pkcs12</CertificateFormat><Password>pwd</Password><CertificateFile>LE_cert.pfx</CertificateFile></Certificate></Set></Request>' -Method POST -body $body

This gives me the following request body:

--db611ddb-ea8a-450f-aad8-90bee1c6a889
Content-Type: application/xml; charset=utf-8
Content-Disposition: form-data; name=reqxml
<Request>
   <Login>
      <Username>apiUSER</Username>
      <Password>apiPWD</Password>
   </Login>
   <Set operation="add">
      <Certificate>
         <Name>LE_cert</Name>
         <Action>UploadCertificate</Action>
         <CertificateFormat>pkcs12</CertificateFormat>
         <Password>password1</Password>
         <CertificateFile>LE_cert.pfx</CertificateFile>
      </Certificate>
   </Set>
</Request>
--db611ddb-ea8a-450f-aad8-90bee1c6a889
Content-Disposition: form-data; filename="LE_cert.pfx"; name="LE_cert"
Content-Type: application/octet-stream
<<--redactedEncodedTXT-->>
--db611ddb-ea8a-450f-aad8-90bee1c6a889--

I think I have got my request in the same format as Trond's example in the referenced post but I am still getting "<Status code="500">Operation could not be performed on Entity.</Status>"

I was wondering how I should encode the certificate, I have tried the above iso-8859-1, but also UTF-8 and Base64 and none of them have got the certificate uploaded.

I think I have got this right, but I just can't get the certificate uploaded, so any help would be greatly appreciated.

Cheers,

Tim



This thread was automatically locked due to age.