iis - 将 Base64 CSR 提交给 Microsoft CA(通过 cURL)

标签 iis curl encoding sed csr

我写了一个 bash 脚本自动生成 IIS7 证书,按照此 ServerFault link .

我想通过 cURL 自动将代码签名请求 (CSR) 发送到内部 Microsoft 证书颁发机构 (MS CA),以下代码很有希望并成功将 CSR 提交给 MS CA:

$ curl -k -u '<Domain>\<Username>':<Password> --ntlm
'https://<InternalMSCA>/certsrv/certfnsh.asp'
-H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
-H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.5'
-H 'Connection: keep-alive'
-H 'Host: <InternalMSCA>'
-H 'Referer: https://<InternalMSCA>/certsrv/certrqxt.asp'
-H 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
-H 'Content-Type: application/x-www-form-urlencoded'
--data 'Mode=newreq&CertRequest=-----BEGIN+CERTIFICATE+REQUEST-----%0D%0AMIIDBjCCAe4CAQAwaDELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE%0D%0ABxMGU3lkbmV5MQwwCgYDVQQKEwNZdW0xDjAMBgNVBAsTBVl1bUlTMRwwGgYDVQQD%0D%0AExN0ZXN0LmF1LmludC50Z3IubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB%0D%0ACgKCAQEAygZvKhfs0mw4tModevTxOIz7eYYM%2B1axNv8FqoNyKr7xtqSbOMiNzf8R3rZ%0D%0A4cTcu5nv7oC7GHPMhnF7AdsO4XexwnKfnCkofECGkO6O4oTmRfUPLa38nV1%2BmytB%0D%0AlrQAl272jQdM9LSxTYW0OR9qO4mjAH1tvLF3IcC1OKOh6UNubdRFfE7dEXWnk%2BSF%0D%0AM8tgl0t3SFsRxrZL3vkgL%2B%2FEmvdOKXeoIey%2F7UMNeWRcwTkS1mw30HjvitJdQGZi%0D%0AgYJ6ldXrrITVKe9QXvVTxSl9NfzPHYp4yf%2FZvAJQmGLZ16aQo0PBeEfjkgkrcY5j%0D%0AMnVI2Q8yC%2BW9Bg%3D%3D%0D%0A-----END+CERTIFICATE+REQUEST-----&CertAttrib=CertificateTemplate%3A*WebServer%0D%0AUserAgent%3AMozilla%2F5.0+%28Windows+NT+6.3%3B+WOW64%3B+Trident%2F7.0%3B+rv%3A11.0%29+like+Gecko%0D%0A&FriendlyType=Saved-Request+Certificate+%287%2F7%2F2015%2C+3%3A46%3A39+PM%29&ThumbPrint=&TargetStoreFlags=0&SaveCert=yes'
| firefox "data:text/html;base64,$(base64 -w 0 <&0)"

我有兴趣在修改后重播这个请求:
  • 解码--数据(确定)
  • 修改--数据(确定)
  • 重新编码...(不行)

  • 编码:

    Mode=newreq&CertRequest=-----BEGIN+CERTIFICATE+REQUEST-----%0D%0AMIIDBjCCAe4CAQAwaDELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE%0D%0ABxMGU3lkbmV5MQwwCgYDVQQKEwNZdW0xDjAMBgNVBAsTBVl1bUlTMRwwGgYDVQQD%0D%0AExN0ZXN0LmF1LmludC50Z3IubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB%0D%0ACgKCAQEAygZvKhfs0mw4tModevTxOIz7eYYM%2B1axNv8FqoNyKr7xtqSbOMiNzf8R3rZ%0D%0A4cTcu5nv7oC7GHPMhnF7AdsO4XexwnKfnCkofECGkO6O4oTmRfUPLa38nV1%2BmytB%0D%0AlrQAl272jQdM9LSxTYW0OR9qO4mjAH1tvLF3IcC1OKOh6UNubdRFfE7dEXWnk%2BSF%0D%0AM8tgl0t3SFsRxrZL3vkgL%2B%2FEmvdOKXeoIey%2F7UMNeWRcwTkS1mw30HjvitJdQGZi%0D%0AgYJ6ldXrrITVKe9QXvVTxSl9NfzPHYp4yf%2FZvAJQmGLZ16aQo0PBeEfjkgkrcY5j%0D%0AMnVI2Q8yC%2BW9Bg%3D%3D%0D%0A-----END+CERTIFICATE+REQUEST-----&CertAttrib=CertificateTemplate%3A*WebServer%0D%0AUserAgent%3AMozilla%2F5.0+%28Windows+NT+6.3%3B+WOW64%3B+Trident%2F7.0%3B+rv%3A11.0%29+like+Gecko%0D%0A&FriendlyType=Saved-Request+Certificate+%287%2F7%2F2015%2C+3%3A46%3A39+PM%29&ThumbPrint=&TargetStoreFlags=0&SaveCert=yes



    解码:
     Mode=newreq&CertRequest=-----BEGIN CERTIFICATE REQUEST-----
     MIIDBjCCAe4CAQAwaDELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE
     BxMGU3lkbmV5MQwwCgYDVQQKEwNZdW0xDjAMBgNVBAsTBVl1bUlTMRwwGgYDVQQD
     ExN0ZXN0LmF1LmludC50Z3IubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
     CgKCAQEAygZvKhfs0mw4tModevTxOIz7eYYM+1axNv8FqoNyKr7xtqSbOMiNzf8R3rZ
     4cTcu5nv7oC7GHPMhnF7AdsO4XexwnKfnCkofECGkO6O4oTmRfUPLa38nV1+mytB
     lrQAl272jQdM9LSxTYW0OR9qO4mjAH1tvLF3IcC1OKOh6UNubdRFfE7dEXWnk+SF
     M8tgl0t3SFsRxrZL3vkgL+/EmvdOKXeoIey/7UMNeWRcwTkS1mw30HjvitJdQGZi
     gYJ6ldXrrITVKe9QXvVTxSl9NfzPHYp4yf/ZvAJQmGLZ16aQo0PBeEfjkgkrcY5j
     MnVI2Q8yC+W9Bg==
     -----END CERTIFICATE REQUEST-----&CertAttrib=CertificateTemplate:*WebServer
     UserAgent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0)
     like Gecko &FriendlyType=Saved-Request Certificate (7/7/2015, 3:46:39
     PM)&ThumbPrint=&TargetStoreFlags=0&SaveCert=yes
    

    重新编码:( URLEncode1URLEncode2URLEncode3 ):

    Mode%3Dnewreq%26CertRequest%3D-----BEGIN+CERTIFICATE+REQUEST-----+MIIDBjCCAe4CAQAwaDELMAkGA1UEBhMCQVUxDDAKBgNVBAgTA05TVzEPMA0GA1UE+BxMGU3lkbmV5MQwwCgYDVQQKEwNZdW0xDjAMBgNVBAsTBVl1bUlTMRwwGgYDVQQD+ExN0ZXN0LmF1LmludC50Z3IubmV0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB+CgKCAQEAygZvKhfs0mw4tModevTxOIz7eYYM%2B1axNv8FqoNyKr7xtqSbOMiNzf8R3rZ+4cTcu5nv7oC7GHPMhnF7AdsO4XexwnKfnCkofECGkO6O4oTmRfUPLa38nV1%2BmytB+lrQAl272jQdM9LSxTYW0OR9qO4mjAH1tvLF3IcC1OKOh6UNubdRFfE7dEXWnk%2BSF+M8tgl0t3SFsRxrZL3vkgL%2B%2FEmvdOKXeoIey%2F7UMNeWRcwTkS1mw30HjvitJdQGZi+gYJ6ldXrrITVKe9QXvVTxSl9NfzPHYp4yf%2FZvAJQmGLZ16aQo0PBeEfjkgkrcY5j+MnVI2Q8yC%2BW9Bg%3D%3D+-----END+CERTIFICATE+REQUEST-----%26CertAttrib%3DCertificateTemplate%3A%2AWebServer+UserAgent%3AMozilla%2F5.0+%28Windows+NT+6.3%3B+WOW64%3B+Trident%2F7.0%3B+rv%3A11.0%29+like+Gecko+%26FriendlyType%3DSaved-Request+Certificate+%287%2F7%2F2015%2C+3%3A46%3A39+PM%29%26ThumbPrint%3D%26TargetStoreFlags%3D0%26SaveCert%3Dyes



    上面链接的三个网站(在重新编码中)都无法正确重新编码。
    棘手的部分是“ = ”和“ & ”不应该被编码。
    URL Encode Simple:
            CR LF           %0D%0A (Not %)
            Space           + (Not %20)
            -               - (Not %2D)
            &               & (Not %26)
            =               = (Not %3D)
            + (in CSR)      %2B
            \ (in CSR)      %2F
            (               %28
            )               %29
    

    我可以 特别使用 sed对于这个例子,但我想知道是否有办法知道服务器期望什么编码,并以正确的字符集进行编码 自动 .这可能吗 ?

    最佳答案

    我在 linux 上用 bash 和 curl 解决了:

    #!/bin/sh
    
    # tested on SUSE Linux 12 SP1
    
    # $1 - CN Object name
    # $2 - username
    # $3 - password
    
    MSCA='HOSTNAME'  # Internal Microsoft Certification Authority
    Username=$2
    Password=$3
    
    function show_usage()
    {
        echo "Scrip for retrive certificate from MS SubCA"
        echo "Usage: $0 <CN> [domain\\\\username] [password]"
        echo " "
        echo "Example: $0 example.com workgroup\\\\foo bar"
        exit 0
    }
    
    if [ -z "$1" ]
    then
        show_usage
        exit 0
    fi
    
    if [ -z "$2" ]
    then
        Username="workgroup\\foo"
        Password="bar"
    fi
    
    
    echo -e "\e[32m1. Generate private key...\e[0m"
    openssl req -new -nodes -out $1.pem -keyout $1.key -subj "/C=RU/ST=State/L=City/O=Org/CN=$1/emailAddress=postmaster@example.com"
    CERT=`cat $1.pem | tr -d '\n\r'`
    DATA="Mode=newreq&CertRequest=${CERT}&C&TargetStoreFlags=0&SaveCert=yes"
    CERT=`echo ${CERT} | sed 's/+/%2B/g'`
    CERT=`echo ${CERT} | tr -s ' ' '+'`
    CERTATTRIB="CertificateTemplate:Server%0D%0A"
    
    echo -e "\e[32m2. Request cert...\e[0m"
    OUTPUTLINK=`curl -k -u "${Username}":${Password} --ntlm \
    "https://${MSCA}/certsrv/certfnsh.asp" \
    -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
    -H 'Accept-Encoding: gzip, deflate' \
    -H 'Accept-Language: en-US,en;q=0.5' \
    -H 'Connection: keep-alive' \
    -H "Host: ${MSCA}" \
    -H "Referer: https://${MSCA}/certsrv/certrqxt.asp" \
    -H 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' \
    -H 'Content-Type: application/x-www-form-urlencoded' \
    --data "Mode=newreq&CertRequest=${CERT}&CertAttrib=${CERTATTRIB}&TargetStoreFlags=0&SaveCert=yes&ThumbPrint=" | grep -A 1 'function handleGetCert() {' | tail -n 1 | cut -d '"' -f 2`
    CERTLINK="https://${MSCA}/certsrv/${OUTPUTLINK}"
    
    echo -e "\e[32m3. Retrive cert: $CERTLINK\e[0m"
    curl -k -u "${Username}":${Password} --ntlm $CERTLINK \
    -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' \
    -H 'Accept-Encoding: gzip, deflate' \
    -H 'Accept-Language: en-US,en;q=0.5' \
    -H 'Connection: keep-alive' \
    -H "Host: ${MSCA}" \
    -H "Referer: https://${MSCA}/certsrv/certrqxt.asp" \
    -H 'User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko' \
    -H 'Content-Type: application/x-www-form-urlencoded' > $1.crt
    
    echo -e "\e[32m4. Verifying cert for $1\e[0m"
    openssl verify -verbose $1.crt
    if [ "0" -eq "$?" ] ;
        then
            echo -e "\e[32mWell done. Have a nice day.\e[0m"
            exit 0
        else
            echo -e "\e[31;47mError code: $?. Stopping.\e[0m"
            exit 1
    fi
    

    关于iis - 将 Base64 CSR 提交给 Microsoft CA(通过 cURL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31283476/

    相关文章:

    php - Curl POST 作为 GET 执行

    java - HttpURLConnection 的响应与curl 响应不同

    c++ - IMFSinkWriter : The request is invalid because Shutdown() has been called

    javascript - 从 NTLM token Javascript 获取用户名

    windows - Windows Azure 上的 IIS 7 默认配置未通过自定义身份验证 header 传递到正在运行的服务

    python - python中elasticsearch的curl帖子

    ios - 带有 Alamofire 4 正文数据的 POST 请求

    python - 高效(时间和空间)字典数据库(唯一词到 uniq id 和返回)

    c# - 在 web.config 中使用 <rewrite> 重定向

    c# - 如何通过代码获取应用程序池名称(C#、ASP.net)