GnuPG + веб-сервис + ASP.NET
Я изможден. Я установил GnuPG и экспортировал секретный ключ и два открытых ключа (мой и один мой клиент) из другого экземпляра GnuPG. Я пытаюсь настроить метод "мой шифрование / дешифрование" на локальной машине.
Когда я запускаю метод шифрования из небольшого консольного приложения, он работает хорошо. Когда я запускаю этот (тот же! - с тем же телом) метод из моего веб-сервиса на моей локальной машине... У меня ExitCode = 2.
Доволен тем, что ловит сообщение об ошибке, но недоволен своим телом.
"gpg: нет секретного ключа по умолчанию: секретный ключ недоступен gpg: XXXXXXXXXXXXXXXX.xml: подписать + сбой шифрования: секретный ключ недоступен"
Что я должен делать? В чем дело?
С наилучшими пожеланиями, Кароль Бладек
2 ответа
Файлы ключей создаются для каждого пользователя. При запуске консольного приложения оно будет искать файлы ключей PGP в вашем каталоге, тогда как при запуске в веб-службе оно будет искать в каталоге идентификационные данные пользователя, используемые веб-службой.
Откройте файл cmd, перейдите в каталог установки GPG и введите gpg -h. Где-то вверху он покажет вам путь, где расположены файлы ключей для вашего вошедшего в систему пользователя.
Чтобы это исправить, вы можете скопировать файлы ключей в то место, где они ожидали найти пользователя веб-службы. Не уверен, есть ли какая-либо опция командной строки для gpg, чтобы выбрать другое расположение файла ключей.
static bool EncryptPGP(string inFile, string outFile)
{
try
{
RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\GNU\GnuPG"); //LocalMachine
if (key != null)
{
string path = key.GetValue("Install Directory").ToString();
string pgpPath = string.Format("{0}\\gpg.exe", path);//@"C:\tools\GNU\GnuPG\gpg.exe";
string password = "No no no no no";
string keyName = "hihi";
string args = string.Format(@"--batch --yes --passphrase {0} --recipient {1} --encrypt --output ""{2}"" --sign ""{3}""", password, keyName, outFile, inFile);
Process proc = Process.Start(pgpPath, args);
if (!proc.HasExited)
{
proc.WaitForExit();
}
return proc.ExitCode == 0;
}
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
return false;
}