Передача HTTPS POST-запросов на бекэнд

iryndin nginx-forum на nginx.us
Пт Июл 23 19:28:10 MSD 2010


Здравствуйте! 

Проблема с передачей POST-запроса,
принятого по HTTPS, на проксируемый Tomcat.

Схема работы сервера: 
впереди стоит nginx, прослушивающий 80 и 443
порты. 
Позади стоит Tomcat, слушающий 8081 порт.
Томкат настроен только на HTTP. 

Nginx раздает статику, а запросы на
динамику передает на Tomcat.

Есть урлы HTTPS-постбеков, на который
приходят данные от стороннего сервера.

nginx принимает HTTPS, расшифровывает его, и
передает данные уже по HTTP на Томкат.
Томкат передает ответ на nginx по HTTP, тот
их передает клиенту по HTTPS.

Проблема в том, что после обработки
nginx-ом на томкате я получаю какую-то
абракадабру в запросе. 

В чем может быть дело?

Ниже привожу конфиг nginx, часть кода
обработчика томката и логи томката:

nginx.conf:

********************************
server {
    listen       443;
    server_name  localhost;

    ssl                  on;
    ssl_certificate       /usr/local/nginx/company/company.ca.crt;
    ssl_certificate_key  /usr/local/nginx/company/company.ca.key;
    ssl_session_timeout  5m;
    ssl_protocols  SSLv2 SSLv3 TLSv1;
    ssl_ciphers 
ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:!LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    location / {
        root   html;
        #Apache/Tomcat we have at 8081 port
        proxy_pass http://127.0.0.1:8081/;
        proxy_redirect     off;
        proxy_set_header  Connection  close;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_pass_header Content-Type;
        proxy_pass_header Content-Disposition;
        proxy_pass_header Content-Length;
        proxy_read_timeout 300;
        proxy_temp_path /var/tmp/nginx;
        client_body_temp_path /var/tmp/nginx/proxy_temp;
        expires 5s;
        access_log /var/log/nginx/https.log main;
    }
        
**********************************

Controller.java:

public ModelAndView postback(HttpServletRequest request,
HttpServletResponse response) throws Exception {
    log.info("[Controller.postback]");
    
    // 
    // Show request body for DEBUG purposes
    //
    BufferedReader reader = new BufferedReader(new
InputStreamReader(request.getInputStream()));
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }
    
    log.info("Request body ++++++++++++++++++++++++");
    log.info(sb.toString());
    log.info("/Request body ++++++++++++++++++++++++");
    
    String action         = request.getParameter("action");
    String customerNumber = request.getParameter("customerNumber");
    String orderNumber    = request.getParameter("orderNumber");
    String orderSumAmount = request.getParameter("orderSumAmount");

    log.info("action="+action);
    log.info("customerNumber="+customerNumber);
    log.info("orderNumber="+orderNumber);
    log.info("orderSumAmount="+orderSumAmount);
    
    .........
}

**********************************

Tomcat log entries:
**********************************
Request body ++++++++++++++++++++++++
invoiceId=12345678&orderSumBankPaycash=1001&paymentType=1&orderNumber=7777&shopId=12103&orderIsPaid=0&shopSumBankPaycash=1001&orderSumAmount=150.00&shopSumAmount=150.00&scid=2827&action=Check&shopSumCurrencyPaycash=643&paymentPayerCode=11111111111111&requestDateTime=2010-07-23T16%3A30%3A06Z&orderSumCurrencyPaycash=643&customerNumber=iryndin&orderCreatedDatetime=2010-07-23T16%3A30%3A06Z&md5=215be52842c0c4d7a93e3a7196ca7209
/Request body ++++++++++++++++++++++++
action=null
customerNumber=null
orderNumber=null
orderSumAmount=null
**********************************

Как видим, в логе выше, если параметры
получаются через request.getParameter(), то они
получаются равными нулю. При этом в
теле POST-запроса все эти параметры
присутствуют. 

А вот ниже более любопытные логи:

Еще одна запись в логе (прием постбеков
от сторонней системы):
***********************************************
Request body ++++++++++++++++++++++++
-----------------------------64243434740Content-Disposition: form-data;
name="requestDatetime";Content-Type:
text/plain;2010-07-23T18:14:49+04:00-----------------------------64243434740Content-Disposition:
form-data; name="md5";Content-Type:
text/plain;91E1495CDBE9D007C061D94AEC7CCBBB-----------------------------64243434740Content-Disposition:
form-data; name="shopId";Content-Type:
text/plain;12103-----------------------------64243434740Content-Disposition:
form-data; name="invoiceId";Content-Type:
text/plain;1099520089681-----------------------------64243434740Content-Disposition:
form-data; name="customerNumber";Content-Type:
text/plain;qaqa-----------------------------64243434740Content-Disposition:
form-data; name="orderCreatedDatetime";Content-Type:
text/plain;2010-07-23T18:14:36+04:00-----------------------------64243434740Content-Disposition:
form-data; name="orderSumAmount";Content-Type:
text/plain;156.21-----------------------------64243434740Content-Disposition:
form-data; name="orderSumCurrencyPaycash";Content-Type:
text/plain;10643-----------------------------64243434740Content-Disposition:
form-data; name="orderSumBankPaycash";Content-Type:
text/plain;1003-----------------------------64243434740Content-Disposition:
form-data; name="shopSumAmount";Content-Type:
text/plain;148.40-----------------------------64243434740Content-Disposition:
form-data; name="shopSumCurrencyPaycash";Content-Type:
text/plain;10643-----------------------------64243434740Content-Disposition:
form-data; name="shopSumBankPaycash";
/Request body ++++++++++++++++++++++++
***********************************************

Тут добавились, видимо,
раскодированные данные формы....
При этом, также как и в предыдущем логе,
параметры, получаемые при помощи
request.getParameter также равны null. 

Как организовать работающую передачу
HTTPS POST-запросов на Tomcat ?

Спасибо!!!

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,112089,112089#msg-112089




Подробная информация о списке рассылки nginx-ru