|
|
2001-12-20 microsoft
' i' {9 v- V" }6 p) k2 [% V$ \# U$ m
. g: S" X9 W& k$ t' v! k& `5 `, x9 X. ]6 A8 J0 v; Y' E' i6 E& {/ q
如果您计划通过Internet销售 MFC控件和ATL 控件,您应该将其打包成签署的小巧(Cabinet -CAB) 文件。签署文件确保用户下载您的控件时源代码是安全的。一个CAB文件包含一个您的控件及其安装信息(比如,都需要哪些动态链接库DLL和OCX一起安装)的压缩版本。 8 [) D( S, \3 r. B$ Q, e
- U! h9 n9 C1 h. ` 创建和签署CAB文件的工具包含于Visual C++ 5.0 光盘中的 CAB&SIGN 目录下面。 该目录下的公用程序在您安装Visual C++时并不会自动地一起安装,因此您必须将CAB&SIGN 目录下面的内容拷贝到您的硬盘驱动器中。
+ }! S( b! }" b, d
" S) U0 L/ ` k* N5 ~) D a; x3 C$ A 在签署文件之前,您需要有一个软件出版商证明书(Software Publisher Certificate)。您必须向证书发放机构(Certification Authority)申请自己的证书。利用CAB&SIGN目录下面的工具,您能够创建一个用于测试的测试证明书,但是该证明书不能用于签署发售的代码。有关申请软件出版商证明书的信息,请参考步骤 1 。 % g4 b: j. l& l! G+ p" m
3 D" H. z7 ]2 K7 w8 r: {
下面是创建签署CAB文件的步骤 : ! x& q. B1 Z& G; j9 V. y G1 N
# q% \6 K7 d) I, x. I0 ?* H5 e
1 获得一个软件出版商证明书 (您只需要这一次申请就可以永久使用)
; z2 O0 X- ^, B! m) a& @) E5 {$ H- h j' q
2 创建 CAB 文件 . u/ b% D6 ?/ ]
% I$ p. G% r( c+ A4 d8 l 3 签署您的文件
' _8 k7 A$ Q3 b8 c0 g6 O# v1 l4 P/ d
4 将签署过的 CAB文件嵌入一个Web页(可选项)获得一个软件出版商证明书
, a& F+ F1 t- e" g: g" I6 u: u4 d4 C0 p2 F8 Y( e% a1 X/ N2 |
在签署文件之前,您需要有一个软件出版商证明书(SPC)。为此,您必须向证书发放机构(Certification Authority)提出申请。在申请过程中,您必须生成一个密匙对,并向证书发放机构提供证明信息,比如说您的名字、地址以及公共密匙。而且,您必须作出具有法律约束力的誓言:您不能也将不会发布您知道或者应该知道其中包含了病毒的软件,或者是恶意破坏用户的机器或代码。
* ^3 Q$ t% X$ L0 j" x# }; \0 ~+ }4 A( L1 p
有关如何得到软件出版商证明书更详尽的信息,请参考Signing Code with Microsoft's Authenticode。若要申请该证书,请参考 Digital Certificates for Authenticode ;若要创建一个测试证书来测试签署文件,请参考Making A Test Software Publisher Certificate. 8 d6 i; u- R1 X4 c: e% h
, D8 i( V) ~+ N8 p5 p( C# r
证书发放机构生成一个符合工业标准X.509证书格式(包含版本3扩展)的软件出版商证明书 。该证书确定并且包含您的公共密匙,并以证书发放机构存档作为参考,把一个拷贝以电子邮件的方式返回给您。收到该证书之后,您应该在所有要发布的、用私人密匙签署的软件当中,包含一份该证书的拷贝。 ! @; P( p# b% v; ?# t8 ^ H
O, v/ }+ Y/ N! _
获得一个软件出版商证明书! r4 G9 t N! V Y
t% ]& B" R; d7 Y4 }
您可以使用Visual C++ 5.0 光盘中CAB&SIGN目录下的 MAKECERT和 CERT2SPC 公用程序,做一个测试软件出版商证明书。注意,该测试软件出版商证明书对真正的软件发布无效,但是能够被用来测试您代码的签署。
' L# X' {9 e8 _% q, F4 `) l5 r
+ n9 [+ e. o: m: l" } B 比如,要做一个私人密匙文件MYKEY.PVK 和一个公司证书CERT.CER,则运行公用程序MAKECERT,其命令如下: 7 G7 E4 M# E; |$ ]$ @) N; J
7 G C/ d& v, |, L) W1 W6 |C:\CAB&SIGN\MAKECERT ; X2 ?1 q0 z- [/ |! e
-u: MyKey
0 P% d6 S/ I4 A" J-n: CN = MySoftwareCompany - {2 {- r9 P8 ^# C
-k: MYKEY.PVK CERT.CER 3 G% z2 \& a: f/ C: U. h
5 f0 y% ?) _8 o$ R! L MyKey 是您的密匙名,MySoftwareCompany 是您的公司名。注意公用程序 MAKECERT 在命令行选项中区分大小写,因此您必须使用小写的-u、-n以及-k;-n选项的值必须是大写的CN=。 " f9 u2 u" d: ?( w0 A `3 a% `
. ?/ f" N3 i# Q- ^4 c 做一个名为CERT.SPC测试软件出版商证明书,则运行公用程序CERT2SPC,命令如下: % O! I: F( O! B- K1 }! Z$ f7 Z
, G) n: ?( O$ q& ^5 i; u) ~C:\CAB&SIGN\CERT2SPC C:\CAB&SIGN\ROOT.CER CERT.CER CERT.SPC
: j. r H( P5 P, P
8 A% {( b% _: L: j r 注意CERT.SPC文件是利用您刚使用MAKECERT创建的CERT.CER文件以及CAB&SIGN目录下面的ROOT.CER文件创建的 。
5 N2 R1 y: ?% t0 w0 N% w- G- O, L1 u* H7 X) \8 Z6 D
创建一个 CAB文件, a' S K0 P+ X# i
6 ~3 r1 _" s. Z) ^
这一部分描述如何创建能在互连网上分派ATL和MFC组件的CAB文件。如果您要了解有关CAB文件的更多信息,请参考Cabinet文件参考书目(File Reference),该文件位于平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\Cabinet Files目录下面。
4 T6 r5 I# K8 H8 P
, \6 j8 P% ]5 n/ ?9 g9 {+ z 创建一个 CAB文件:
m# B7 _; t" \& u" p: n" E! C7 z: t* Q+ z' \7 K# t' O
创建一个INF文件。 / G; Q4 I3 n7 g2 D% Z
+ K* ~4 s1 p0 d. M X
运行公共例程CABARC(在光盘上的CAB&SIGN目录中)。例如:
; }; C* B1 L9 s( {6 x! z" z! _4 l _& m( ^; N' G5 X4 {
C:\CAB&SIGN\CABARC -s 6144
% P& I, X5 L d6 N- K2 P2 ln MYCTL.CAB NEEDED1.DLL NEEDED2.DLL MYCTL.OCX MYCTL.INF
@) R1 ?8 h. ^6 V7 A8 ]
- c- @( A1 z. Q, r* }% V& A# d CABARC 创建了一个名为MYCTL.CAB的CAB文件。
7 _; W1 s0 e( i: l( L3 H. F$ ]5 s3 D* O' F9 L, b
您必须在您的源文件(INF、OCX以及DLL文件)目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中的完全一致。在上例中,INF文件的列出次序是NEEDED1.DLL,然后 是NEEDED2.DLL,最后是MYCTL.OCX。
% l, ?7 O0 c3 ]) n3 K. Z
+ S6 T3 T* i8 i -s选项为代码签署保留空间。n 命令指定您想创建的是CAB文件。CABARC 命令和选项的说明可以查看,其方式是在命令行键入CABARC:
4 ~& E5 t5 ?* I2 s" l8 |0 H# r# i* B7 k, Z1 T
C:\CAB&SIGN\CABARC ; q- {( x8 o5 l; N
9 X8 X" X3 k: ~- n/ Q. K. O
创建一个INF文件+ s7 _1 y" b+ c2 b
4 v9 s+ H7 G6 A3 e, c: j INF文件是一个文本文件,指定运行控件所需要下载或者呈交的文件(比如DLL或者其它OCX)。一个INF文件就捆绑了CAB压缩文件所有的必须文件。 缺省情况下,与现有硬盘中文件版本号相同的文件不被下载。要了解有关INF文件及其选项(包括如何创建独立于平台的INF文件)的详细情况,请参考万维网站Packaging Component Code for Automatic Download,或者参考平台软件开发工具包(Platform SDK,包含在Visual C++ 5.0联机文档中)的设置和系统管理服务(Setup and System Management Services)部分的\Setup API\Overview\INF Files目录下的内容。 0 g+ r+ Y% K! ?) S1 E$ s
( o' W5 X3 N1 A: {8 m; m
作为示例,下面的INF是用来为ATL多边形控件创建一个CAB文件的。 您可以通过从Visual C++ 5.0光盘下载ATL POLYGON示例程序来创建POLYGON.DLL,并创建一个最小版本。创建该最小版本另外需要一个DLL即 ATL.DLL。ATL.DLL要先于POLYGON.DLL注册,因此首先把ATL.DLL 放置到INF当中。 2 r* m1 T0 S8 K6 ?8 }& _0 \3 }( k9 q
3 s+ [7 E# S( k$ s9 |8 V
; Sample INF file for POLYGON.DLL# e! q" [! o" c3 x. K* G% Y
[version]
. w O5 d) K, {* w$ {% h; version signature (same for both NT and Win95) do not remove+ n1 l* e) t& j0 @( z: ?
signature="$CHICAGO$"( T# Y: x7 l1 U- D& o1 f
AdvancedINF=2.0* m. D% X$ D: v9 r, J, s0 `
! h8 {/ ?& q4 R( Q' Z9 [[Add.Code]
1 e2 ^- C1 V2 f3 N* ?( dpolygon.dll=polygon.dll& s3 f' @& y5 D# {. C7 @
atl.dll=atl.dll) c. ]# k: |: L7 t: `
( ]: o" g( x2 ^( _: ^; needed DLL m( L) c( Z; ^2 l6 ~9 x. \/ n
[atl.dll]
0 ]8 g' o- l& Sfile-win32-x86=thiscab: k+ G/ z2 q, u; V& g. V
FileVersion=2,00,0,7024
O' h1 _% u# N1 a7 |) cDestDir=11
0 V, E+ t5 c' w VRegisterServer=yes 3 P% A/ K3 L9 j$ e2 n% _2 H
4 z) c: m9 e: c/ A9 p
[polygon.dll]
" Q( M9 b) \1 t& @8 x Kfile-win32-x86=thiscab
% L" `5 Y" {) Y9 e7 ]2 xclsid={4CBBC676-507F-11D0-B98B-000000000000}
, ]! _/ y" m2 {5 F& xFileVersion=1,0,0,1 ) X V E8 N9 G0 H+ I6 r' `: s) ?/ `
RegisterServer=yes- x5 M2 M! A2 w% h; `' g
; end of INF file , x" p3 |" \) t5 V; V0 d: Y
/ {' u* x9 p6 j5 [+ f: x 该INF指定了系统需要安装特定版本的ATL.DLL。如果系统中还没有该文件,则需要从和该INF一起创建的CAB文件下载。"thiscab" 是一个关键字,意指包含该INF的CAB文件。您也可以从网上下载所需要的DLL文件,只要指定一个HTTP 网址即可,绝对路径或者相对路径都可以,比如:
! L, M4 H, z5 J: ] a) t/ K! @8 ^; ~! k
file-win32-x86=http://www.mysite.com/mydir/NEEDED.DLL - Z4 p/ s( L- k, X( t& N: _' Y5 a
6 l/ h! K: u* o0 Y; d: D% A( W 关键字"file-win32-x86" 指定平台是 x86。 1 Y$ V. s+ E r1 A5 L* g
6 {" D: n$ |' U% y' t8 L 得到一个文件的版本号的过程是:在Windows NT或者Windows 95 Explorer中右键点击该文件;从弹出列表中选择Properties,然后在接着弹出的对话框中选择版本标签。有时,您可能需要在文件版本中插入一个额外的0 。比如,对话框中显示ATL.DLL的版本号是2.00.7024,在INF文件中则变为2,00,0,7024 。 ! t7 ~( ?. R" G# _( I; q' i$ `: m% n
+ R3 z" A7 d, r4 m8 ]! }; E "DestDir"指的是装载目录或者文件的地址: 11 指定为系统目录 WINDOWS/SYSTEM 或者 WINNT/SYSTEM32; 10 规定为窗口目录、WINDOWS或者WINNT。如果没有指定DestDir(典型情况),则代码从固定的OCCACHE目录装载。
+ Y: l9 W7 `( N+ J- R& X" T% f+ Z. V5 u: |$ X9 d! ?. v7 N1 t
"clsid" 指的是要安装控件的CLSID。
6 E- U+ w9 o$ `# ~$ U1 Y
% R8 ~7 W4 @, O' e8 B 创建 INF文件后,再运行CABARC公用程序(在Visual C++ 5.0光盘上的CAB&SIGN目录中)创建CAB文件。您必须在您的源文件目录下面运行CABARC。存档在CAB 文件中的文件需要在命令行列出,次序同它们在INF文件中完全一致。比如,从上面的INF文件为多边形控件做一个CAB文件,需要使用下面的命令 :
7 H: a, m7 p a" o/ y$ D
% n4 Y# a- N' v! H C:\CAB&SIGN\CABARC -s 6144 POLYGON.CAB ATL.DLL POLYGON.DLL POLYGON.INF! u: _8 Z# a: z, t# U
2 H3 O8 n' q& g5 F
该CAB文件包含ATL.DLL和POLYGON.DLL的压缩版本,以及将它们展开到POLYGON.INF 文件所需要的信息。 , Q& G. a8 y( Y! f2 @/ w' E
8 q; K+ j4 h1 a8 [4 Z 有关创建一个下载MFC控件的CAB文件的示例,请参考MFC 4.2b Component Download Information.您需要包含在MFC控件中的DLL文件有MSVCRT.DLL,MFC42.DLL以及 OLEPRO32.DLL。 ( z) C; L$ Y7 d& i4 I9 w8 V
# d" t( Q5 Q U& A9 @9 T 签署一个CAB文件
% [' z. Y/ N. k2 X7 a/ B+ l3 _; l
4 T6 n2 c5 h9 @+ V 使用Code Signing Wizard签署一个CAB文件: " m- F( [) y( Y. y: c* L
+ j7 `) k% ~, |% K* y/ d
1. 运行公用程序 SIGNCODE (在Visual C++ 5.0光盘的CAB&SIGN 目录下),启动Code Signing Wizard。
! K) w/ p% C a4 D; d! l8 Z
# C) K+ W- r' o# j C:\CAB&SIGN\SIGNCODE+ d9 r+ t/ m4 F n3 K. y! G
+ r# a$ V K* c2 P f$ n& o, F& M 2. 在Code Signing Wizard对话框当中,点击Next前进到下一页。
+ Y- Z" q& x/ h" T9 w6 [# w4 C* R1 [2 ], V- X2 u# C
3. 在您想签署那一个程序? 编辑框中,键入您想签署的CAB文件。 5 L0 T3 x# s1 ~' I. h/ ^
* V d+ C- K5 A8 |! }1 g 4.在您想在证书中使用什么名字? 编辑框中,键入您想在证书中使用的名字。 1 d$ }5 b, z6 d6 z3 x
+ W0 \ ?- w9 J, T
( s- }( T7 Z! E" a 5. 点击Next,前进到下一页。 9 k) r9 E# B1 k. q2 u
0 |. p P$ L& V! t
6. 在 您想将该程序签署在哪一个软件开发商证书下面? 编辑框中,键入软件开发商证书(SPC)文件名。
" V5 f: z2 V! F& T+ Q
: `1 Z' e n, `5 O/ I 7. 在您要在该证书的哪一个文件中查找密码、密匙? 编辑框中,键入私人密匙(PVK)文件名。 " d: [. e# M: ]( U
8 `# v/ Z) S+ L0 {. R. [ 8. 连续两次点击 Next前进到最后一页。
8 o5 O8 m/ t0 g. {6 W! g
8 Q4 D0 f( d7 Q5 F* u4 r2 V 9.点击Sign,签署CAB 文件。您的文件将被数字化签署。 7 b+ K3 l2 F; h }7 m
9 E( C" {: v7 ~" K, b4 A
您可以不使用CAB文件直接签署您的DLL和OCX 。CAB文件的好处在于它是压缩的,而且,如果和INF文件一起使用,可以将所有必要代码捆绑在一起。
* K" Z/ s+ a- R$ A/ B$ F9 w
6 K! I, ^& [4 z5 k" K 将签署过的 CAB文件嵌入一个Web页8 s% H# q- W# l& l! Y- Q2 c
) ^0 S: R( Q T, p! {! e
ATL和MFC控件使用标签嵌入网页。在标签,您需要为该控件指定三个属性 : ' M0 u& D! _- N: \& \ t. Z1 D/ Z
h- \$ i3 j% s# V+ B ID - 控件名称 0 a, W7 m& a8 Q0 z7 D& i O
3 C* e* i, G0 w& K6 k CLASSID - 控件的CLSID - w/ P: c$ H: v! A8 |
7 {% s- Z N& y( U+ X2 y( s6 k! e
CODEBASE - 下载控件的位置。CODEBASE 可以指向许多不同的文件类型。
6 F! y9 j" R" v6 A& a, {8 M- U/ n" R: V- `
CODEBASE可以直接指向一个OCX 文件或者DLL文件: 4 w' E0 Q- C% { n+ W
9 x+ D( s0 Y9 E1 @# }CODEBASE="http://www.mysite.com/mydir/polygon.dll#version=1,0,0,1"
! p( Q+ n" ?% K7 [# b2 h" {- D6 v- A. O# H$ k) G/ \( U2 W
因为这仅仅完成了DLL或OCX文件的下载和安装,任何必要的DLL支持必须已经装载到了客户机上。 ; ^8 i- b* }1 }2 z$ Y# `$ {5 a
6 k e# {# b4 `( @8 {4 T$ u 如果您在CAB文件中包含了选项版本号,它应该指向要下载的控件。例如,如果POLYGON.DLL有一个版本号1,0,0,1,则CAB文件的版本号也必须是1,0,0,1:
' h# d- N6 h" c" f n9 \. s: S) e* ?" U: s% e/ I- C3 n3 P. o7 T! b
CODEBASE="http://www.mysite.com/mydir/polygon.cab#version=1,0,0,1"
' e6 u- K0 R. G4 P( n1 P6 J) f6 K5 E% m: {: y) F
如果您没有包含选项版本号,则不能替换同一个组件(如果它们出现在客户机上的话)的老版本号。 |
|