1

我正在阅读有关如何允许 android 客户端使用自签名证书的文章:

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html#comment-form

在第 2 步中,我必须运行一些命令,但我对 shell 不太熟悉,并且在尝试运行以下命令时遇到语法错误:

export CLASSPATH="/Users/me/Desktop/lib/java/bouncycastle/bcprov-jdk16-145.jar"
CERTSTORE=res/raw/mystore.bks
if [ -a $CERTSTORE ]; then
    rm $CERTSTORE || exit 1
fi
keytool \
  -import \
  -v \
  -trustcacerts \
  -alias 0 \
  -file <(openssl x509 -in mycert.pem) \
  -keystore $CERTSTORE \
  -storetype BKS \
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
  -providerpath /usr/share/java/bcprov.jar \
  -storepass mypassword

我运行时遇到的错误:

./test.sh: line 11: syntax error near unexpected token `('
./test.sh: line 11: `  -file <(openssl x509 -in mycert.pem) \'

所以 -file 语法是有问题的,但我不确定要改成什么,因为我不知道 -file 参数可以处理什么语法。

有人知道吗?我在mac 10.6上,

谢谢

- - - - - 更新 - - - - - - - -

如果我用“$”替换“<”字符,执行时会出现以下异常:

java.lang.RuntimeException: Usage error, CERTIFICATE----- is not a legal command
  at sun.security.tools.KeyTool.parseArgs(KeyTool.java:375)
  at sun.security.tools.KeyTool.run(KeyTool.java:171)
  at sun.security.tools.KeyTool.main(KeyTool.java:166)

嗯,我不明白异常告诉我哪个参数不好。脚本更新如下:

export CLASSPATH="/Users/me/Desktop/lib/java/bouncycastle/bcprov-jdk16-145.jar"
CERTSTORE=res/raw/mystore.bks
if [ -a $CERTSTORE ]; then
  rm $CERTSTORE || exit 1
fi
keytool \
  -import \
  -v \
  -trustcacerts \
  -alias 0 \
  -file $(openssl x509 -in mycert.pem) \
  -keystore $CERTSTORE \
  -storetype BKS \
  -provider org.bouncycastle.jce.provider.BouncyCastleProvider \
  -providerpath /usr/share/java/bcprov.jar \
  -storepass mypassword

谢谢!

4

1 回答 1

2

你可能没有运行 Bash。这<()称为进程替换。其他一些 shell 支持它,但 Bourne shell 不支持。

它创建了一个匿名命名管道,因此-file看到了一个文件名,但文件内容实际上是openssl x509命令的输出。

您可以通过确保脚本中的第一行是:

#!/bin/bash
于 2011-03-11T06:10:53.693 回答