NSTask - 响应来自OpenSSL的输入请求

时间:2013-07-17 14:13:09

标签: objective-c cocoa ssl-certificate

我似乎在理解Cocoa中的NSTask时遇到了一些麻烦。我想要启动的应用程序是openSSL。目前,我能够发送信息(发布路径,参数等),我也可以使用NSPipe获得响应。我需要做的是响应应用程序要求的输入请求。使用以下代码,我可以发送和读取文件中的响应:

 NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: launchPath];
[task setArguments: arguments];
[task setCurrentDirectoryPath:dir];

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

NSData *data;
data = [file readDataToEndOfFile];
NSString *response =  [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

一旦我启动NSTask,我应该提供域名,国家等等。我的问题的原因是因为我需要能够使用openSSL生成证书签名请求并发送它,以及一些其他数据,到服务器。上面的代码没有被破坏,我只是不确定如何发送该输入。

另外,如果有人在Cocoa / ObjC上使用了某种openSSL实现,并认为这比使用NSTask更好,我也完全对此持开放态度。

先谢谢。

1 个答案:

答案 0 :(得分:2)

并非任何人都在考虑这个问题,但如果你是,并且还不知道答案,我找到了解决办法,但结果却采用了不同的方法。我只是传递-subj参数而不是发送额外的输入。但是,我最初要求的解决方案如下:

NSTask *task = [[NSTask alloc] init];

NSString *tmpdir=NSTemporaryDirectory();
[task setCurrentDirectoryPath:tmpdir];

[task setLaunchPath:@"/usr/bin/openssl"];
NSArray *sslarguments=@[@"req",@"-nodes",@"-newkey",@"rsa:2048",@"-keyout",@"myserver.key",@"-out",@"server.csr"];
[task setArguments:sslarguments];


NSPipe * in = [NSPipe pipe];

[task setStandardInput:in];

NSData *data=[@"GB\nYorks\n\nYork\SimuplanSL\nIT\nsomeone@simuplan.com" dataUsingEncoding:NSUTF8StringEncoding];

[task launch];
[[in fileHandleForWriting] writeData:data];
[task waitUntilExit];

我只需要写入临时目录中的文件并通过输入管道提供它。