Используйте обратный прокси nginx:
apt-get install nginx
. Примечание. Я предположил, что у вас уже нет apache или другого веб-сервера на хосте ... /etc/nginx/sites-available
, который перенаправляет этот сайт на http-сайт докер-контейнера, который будет работать на каком-то другом заранее установленном порту (например, 2001, 2002, ...). Каждый сайт получает свой собственный файл, как тот, который приведен ниже, но с разными заранее подготовленными портами для каждого сайта. Внешние пользователи получат доступ к ним на порту 80 того же IP-адреса, но с разными именами веб-сайтов, и из этих имен nginx будет обрабатывать необходимые внутренние подключения незаметно. /etc/nginx/sites-enabled
и перезапускали nginx
. Позже вы можете удалить одну из этих ссылок и перезапустить nginx, если вам нужно временно отключить доступ к сайту. docker run
в /etc/rc.local
и перенаправляя предварительно назначенный порт хоста (localhost: 2001) в контейнерный порт 80, например docker run -d -p localhost:2001:80 imageA
Если контейнер упал, вы получите ошибку шлюза от nginx. Это может быть настроено для показа пользовательской HTML-страницы. Для большей надежности лучше управлять контейнерами в supervisord
или другом диспетчере процессов, который обновляет мертвые процессы.
Вот пример файла сайта nginx для перенаправления на порт 2001:
upstream dockerA {
server localhost:2001;
}
server {
listen 192.168.1.8:80; // REPLACE WITH HOST NUMERIC IP ADDRESS
root /var/web/siteAstaticfiles;
index index.html;
server_name www.siteA.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://dockerA;
}
}
В этом примере, хотя локальный каталог диска для файлов HTML настроен для сайта A, он не используется. Вместо этого все запросы отправляются вверх по течению. Я не проверял, можно ли безопасно пропустить строки root
и index
.
По крайней мере Вы используете отличающиеся векторы инициализации (IV).
код .NET использует ключ для IV.
private static AesCryptoServiceProvider GetProvider(byte[] key)
{
//Set up the encryption objects
AesCryptoServiceProvider result = new AesCryptoServiceProvider();
byte[] RealKey = Encryptor.GetKey(key, result);
result.Key = RealKey;
result.IV = RealKey;
return result;
}
и
private static byte[] GetKey(byte[] suggestedKey, AesCryptoServiceProvider p)
{
byte[] kRaw = suggestedKey;
List kList = new List();
for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8 )
{
kList.Add(kRaw[i % kRaw.Length]);
}
byte[] k = kList.ToArray();
return k;
}
, который должен, вероятно, быть: kList.Add(kRaw[(i / 8) % kRaw.Length]);
. Иначе ключ, % длины которого 8 == 0 будет неоднократно использовать ту же букву, doh!
Таким образом IV (и ключ) используемый .NET: hleolhleolhleolh
. Это не часть API, а скорее из-за кода обертки, на который Вы указали (который имеет серьезную ошибку в нем...).
код iPhone использует 0 для IV.
// Initialization vector; dummy in this case 0's.
uint8_t iv[kChosenCipherBlockSize];
memset((void *) iv, 0x0, (size_t) sizeof(iv));
, openssl по умолчанию предварительно ожидает случайным образом сгенерированную соль (который является, почему вывод дольше!).
вывод openssl более безопасен, так как он предварительно ожидает случайный вектор инициализации. Это похоже на первые несколько байтов base64, декодируемая строка "Посолилась __". Можно также попросить, чтобы openssl не использовал соль (-nosalt) и / или обеспечил IV (-iv).
По существу, openssl, .NET и iPhone используют то же шифрование, просто необходимо быть осторожными, как Вы инициализируете API с ключом шифрования и вектором инициализации.
Вы уверены, что используете тот же ключ AES в Ваших тестах? Пример OpenSSL в Вашем сообщении использует пароль, который OpenSSL получает ключ и IV от (и вероятно использует соль также.
Генерируют случайный 128-разрядный ключ и указывают этот ключ в шестнадцатеричном формате к OpenSSL с:
openssl enc -aes-128-cbc -a -in hello.txt -K KEY_IN_HEX -iv 0
Вы не должны использовать IV=0 ни в какой защищенной системе, но для тестирования совместимости, это в порядке.